web-dev-qa-db-ja.com

Mybatis-Error設定nullパラメータ

Mybatis-spring-1.0.3-SNAPSHOT mybatis-3.0.6 spring3.0.6を使用しました。次のようにテーブルからレコードを削除しようとしました:

        <delete id="deleteNote" parameterType="hashMap">
    DELETE FROM BBSCS_NOTE 
    <where>
        <if test="ids !=null and ids.length > 0">
            <foreach collection="ids" item="id" open="(" close=")" separator=",">
                ID IN #{id}
            </foreach>
        </if>
        <if test="toID != null and toID != ''">AND TOID = #{toID}</if>
        <if test="fromID != null and fromID != ''">AND FROMID = #{fromID}</if>
        <if test="noteType != -1">AND NOTETYPE = #{noteType}</if>
    </where>         
</delete>

ご覧のとおり、これは動的なSQLです。Javaテストコードは次のようになります。

Map map = new HashMap();
String ids[] = {"1","2","3"};
map.put("ids", ids);
noteService.del(map);

Javaテストコードを実行したとき、次のような例外がありました:

   org.springframework.jdbc.UncategorizedSQLException: Error setting null parameter.  Most JDBC drivers require that the JdbcType must be specified for all nullable parameters. Cause: Java.sql.SQLException: Invalid column type
; uncategorized SQLException for SQL []; SQL state [null]; error code [17004]; Invalid column type; nested exception is Java.sql.SQLException: Invalid column type

なぜですか?この問題を解決するためのアドバイスを教えていただけますか?.

14
user1091038

OKいくつか問題があります。まず、準備されたステートメントまたは呼び出し可能なステートメントにnullパラメータを設定する場合、MyBatisはjdbcタイプを知る必要があります。このような、

#{myNullParamenter, jdbcType=VARCHAR}

また、in句が正しく生成されていません。値のリストのみを生成するには、foreachタグを使用する必要があります。 「ID IN」の部分をforeachタグの外に移動します。

<if test="ids !=null and ids.length > 0">
    ID IN
    <foreach collection="ids" item="id" open="(" close=")" separator=",">
        #{id}
    </foreach>
</if>

HashMapsを使用しないこともお勧めします。新しいマッパークラスははるかに優れています。

19
Andy

問題は、3.0.xバージョンではnullパラメータのデフォルトのJDBCタイプがTypes.OTHEROracle 10gなどの一部のJDBCドライバーではサポートされていません。

ここ この問題を説明する投稿。

私が見つけた解決策は非常に簡単です。設定ファイルでjdbcTypeForNullNULLに設定します。

<configuration>
    <properties resource="mybatis-config.properties" />
    <settings>
        <setting name="jdbcTypeForNull" value="NULL" />
    </settings>

    <environments default="development">
    ....
    </environments>

    <mappers>
    ....
   </mappers>
</configuration>
14
Mouna