2011-12-10 29 views
9

Ho usato mybatis-primavera-1.0.3-SNAPSHOT mybatis-3.0.6 spring3.0.6.I tentato di eliminare record da una tabella come questa:Mybatis errori di impostazione dei parametri nulli

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

Come hai visto, si tratta di un codice di test sql.The Java dinamico come questo:

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

Quando ho eseguito il codice di prova Java, c'era qualche eccezione in questo modo:

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 y? puoi darmi qualche consiglio per risolvere questo problema? Grazie.

risposta

15

OK Vedo alcuni problemi. Per prima cosa, quando si imposta un parametro nullo in un'istruzione preparata o in un'istruzione Callable, MyBatis deve conoscere il tipo jdbc. Ti piace questa,

#{myNullParamenter, jdbcType=VARCHAR} 

si sta anche generando il vostro 'nella clausola in modo non corretto. È necessario utilizzare il tag foreach per generare solo la lista dei valori. Sposta la parte "ID IN" dal tag foreach.

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

Vorrei anche evitare di utilizzare HashMaps. Le nuove classi di Mapper sono molto meglio.

7

Il problema è che, poiché le versioni 3.0.x il tipo JDBC di default per i parametri nulli è Types.OTHER che non supportata da alcuni driver JDBC come Oracle 10g.

Here un post che spiega questo problema.

La soluzione che ho trovato è molto semplice, ho impostato jdbcTypeForNull su NULL nel file di configurazione.

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

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

    <mappers> 
    .... 
    </mappers> 
</configuration> 
Problemi correlati