今天在用MyBatis查詢根據輸入Date的條件查詢時,發生下面錯誤。
### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
### Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:79)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:447)
at com.sun.proxy.$Proxy12.selectList(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:231)
at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:137)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:75)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
...
問題發生的原因是還蠻愚蠢的,但有時候小小的錯誤也是找老半天,下面是造成錯誤的mapper範例,相信聰明的你應該是很快就發現問題了。
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="idv.matt.mapper.UserProfileMapper">
<resultMap id="UserProfileResultMap" type="idv.matt.model.UserProfile">
<result column="USER_NAME" jdbcType="VARCHAR" property="userName" />
<result column="PASSWORD" jdbcType="VARCHAR" property="password" />
<result column="BIRTHDAY" jdbcType="DATE" property="birthday" />
</resultMap>
<select id="selectUser" resultMap="UserProfileResultMap" parameterType="idv.matt.model.UserProfile">
SELECT USER_NAME, USER_EMAIL FROM USER_PROFILE
<where>
<if test="birthday != null and birthday != ''">
AND BIRTHDAY > #{birthday,jdbcType=DATE}
</if>
</where>
</select>
</mapper>
造成錯誤的原因是下面這一段,UserProfile.birthday
的型態是Date
,但在MyBatis的動態條件中卻有是否為空字串的判斷而造成錯誤,所以只要把birthday != ''
拿掉就好了。
<if test="birthday != null and birthday != ''">
沒有留言:
張貼留言