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
なぜですか?この問題を解決するためのアドバイスを教えていただけますか?.
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を使用しないこともお勧めします。新しいマッパークラスははるかに優れています。
問題は、3.0.xバージョンではnullパラメータのデフォルトのJDBCタイプがTypes.OTHER
Oracle 10gなどの一部のJDBCドライバーではサポートされていません。
ここ この問題を説明する投稿。
私が見つけた解決策は非常に簡単です。設定ファイルでjdbcTypeForNull
をNULL
に設定します。
<configuration>
<properties resource="mybatis-config.properties" />
<settings>
<setting name="jdbcTypeForNull" value="NULL" />
</settings>
<environments default="development">
....
</environments>
<mappers>
....
</mappers>
</configuration>