iBatis SQL 映射器日期参数

iBatis SQL Mapper Date Argument

我是 Spring 的新手,我对 iBatis 有点困惑。我接到一项任务来编辑 select 查询条件(非常简单),但事情变得棘手。 我只将 java.sql.Date 对象(带有 setter 和 getter)传递给 SQLMapper 以提供条件参数。 这就是我的 WHERE 子句的样子

<sql id="dateWhere">
    <where>
       <if test="arg.sqlStartDate != null and arg.sqlEndDate != null">
          table.date BETWEEN #{arg.sqlStartDate} AND #{arg.sqlEndDate}
       </if>
    </where>
</sql>

但是我得到一个错误

org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='arg.sqlStartDate', mode=IN, javaType=class java.lang.Object, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException

而且我研究了我需要指定参数的 jdbcTypeSOlink。还添加了一个 DATE() 函数来进一步指定参数是一个 DATE 变量。

 <sql id="dateWhere">
        <where>
           <if test="arg.sqlStartDate != null and arg.sqlEndDate != null">
              table.date BETWEEN DATE(#{arg.sqlStartDate,jdbcType=DATE}) AND DATE(#{arg.sqlEndDate,jdbcType=DATE})
           </if>
        </where>
  </sql>

我让它工作了。但是我注意到其他 Mapper 他们没有指定每个参数的 jdbcType 。所以我对这个问题到底是什么,是什么原因造成的,这是怎么发生的,我做错了什么感到困惑。只是给我信息,以进一步了解这件事。谢谢

您不需要使用 DATE() 函数。 使用 java.util.Date 而不是 java.sql.Date 并且 table.date BETWEEN #{arg.sqlStartDate} AND #{arg.sqlEndDate} 应该有效。

显然 iBatis 可以比 java.sql.Date

更好地处理 java.util.Date

https://ibatis.apache.org/docs/java/pdf/iBATIS-SqlMaps-2_en.pdf

第 26 页,第 jdbcType

这是因为 JDBC 驱动程序无法自动识别某些列的列类型。