私は次のように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」は正確に文字列タイプであるため、「javaType = classJava.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}%」である必要があります。私はそれを変更しました、そしてそれはうまく働きます。それは本当にばかげた問題です。もっと気をつけるべきだと思います。
文字列ではなく、善意の日付を使用してください。変化する:
#{beginDate,jdbcType=VARCHAR}
ために:
#{beginDate,jdbcType=DATE}
(時刻なし)、または#{beginDate,jdbcType=TIMESTAMP}
(時刻を含める必要がある場合)。endDate
パラメーターにも同じ変更を加えます。
また、適用するJavaパラメーターは次のタイプである必要があります:
Java.sql.Date
(時間のない日付)、Java.sql.Timestamp
(タイムスタンプ)、またはJava.util.Date
(日時)。回答を再投稿します。
変化する c1.con_name LIKE'%#{consultName}%'
toc1.con_name LIKE'%${consultName}%'
。
注:#の代わりに$を使用してください