Mybatis-Error:无法设置映射参数

时间:2018-04-16 13:43:49

标签: java sql mybatis

我创建了一个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 &gt;= #{beginDate,jdbcType=VARCHAR}
    </if>
    <if test="endDate != null">
        AND r2.rdt_date &lt;= #{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}%'。我改变它,它工作正常。这是一个非常荒谬的问题。我想我应该更加小心。

2 个答案:

答案 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}%'

注意:使用 $ 代替