2011-12-10 98 views
9

I使用spring3.0.6.Iはこのようなテーブルからレコードを削除しようとしたMyBatisの-3.0.6 MyBatisのスプリング-1.0.3-SNAPSHOT:あなたが持っているとしてMyBatisの-エラー設定nullパラメータ

 <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> 

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 

Whの:私はJavaのテストコードを実行

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

、このようないくつかの例外がありました:見て、それはこのような動的sql.The Javaのテストコードですあなたは私にこの問題を解決するためのアドバイスをくれますか?ありがとう。

答えて

15

OK問題がいくつか表示されます。第1に、Prepared StatementまたはCallable Statementにnullパラメータを設定する場合MyBatisはjdbc型を知る必要があります。このよう 、あなたはまた間違っ句であなたの」を生成している

#{myNullParamenter, jdbcType=VARCHAR} 

。値のリストのみを生成するには、foreachタグを使用する必要があります。 foreachタグから "ID IN"部分を移動します。

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

また、HashMapsを使用しないことをおすすめします。新しいMapperクラスがはるかに優れています。

7

nullパラメータのデフォルトJDBCタイプがTypes.OTHERであり、Oracle 10gのような一部のJDBCドライバではサポートされていないという問題があります。

Hereこの問題を説明する記事。

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

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

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

    <mappers> 
    .... 
    </mappers> 
</configuration> 
関連する問題