我创建了一个sql查询,如下所示
<select id="getReservationByConditions" resultMap="record">
SELECT *
FROM (reservation_record r1 LEFT JOIN real_duty_time r2 ON r1.rdt_id = r2.rdt_id) LEFT JOIN consultant c1 ON r2.con_id = c1.con_id
WHERE r1.stu_name LIKE '%${stuName}%' AND c1.con_name LIKE '%#{consultName}%'
<if test="beginDate != null">
AND r2.rdt_date >= #{beginDate,jdbcType=VARCHAR}
</if>
<if test="endDate != null">
AND r2.rdt_date <= #{endDate,jdbcType=VARCHAR}
</if>
</select>
参数的值是
String stuName = "nike";
String beginDate = "2018-03-01";
String endDate = "2018-06-01";
String consultName = "";
错误是
org.mybatis.spring.MyBatisSystemException:
nested exception is org.apache.ibatis.type.TypeException:
Could not set parameters for mapping: ParameterMapping{property='endDate', mode=IN, javaType=class java.lang.Object, jdbcType=VARCHAR, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}.
Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #3 with JdbcType VARCHAR .
Try setting a different JdbcType for this parameter or a different configuration property.
Cause: org.apache.ibatis.type.TypeException:
Error setting non null for parameter #3 with JdbcType VARCHAR .
Try setting a different JdbcType for this parameter or a different configuration property.
Cause: java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2).
参数“endDate”正是String类型,为什么“javaType = class java.lang.Object”。
我该如何解决?
感谢您的帮助。
java映射器代码如下:
List<ReservationRecord> getReservationByConditions(@Param("stuName")String stuName, @Param("beginDate")String beginDate, @Param("endDate")String endDate, @Param("consultName")String consultName);
好吧。我知道我的代码有什么问题。 sql查询中的'%#{consultName}%'应为'%$ {consultName}%'。我改变它,它工作正常。这是一个非常荒谬的问题。我想我应该更加小心。
答案 0 :(得分:2)
不要使用字符串,但要使用真正的日期。变化:
#{beginDate,jdbcType=VARCHAR}
有:
#{beginDate,jdbcType=DATE}
(当天没时间)或#{beginDate,jdbcType=TIMESTAMP}
(如果您需要包含当天的时间)。 对endDate
参数进行相同的更改。
您要应用的Java参数应为:
java.sql.Date
(没有时间的日期),java.sql.Timestamp
(时间戳)或java.util.Date
(日期和时间)。答案 1 :(得分:0)
重新发布答案。
将c1.con_name LIKE'%#{consultName}%'
更改为 c1.con_name LIKE'%${consultName}%'
。
注意:使用 $ 代替#