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
而且我研究了我需要指定参数的 jdbcType
。 SOlink。还添加了一个 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 驱动程序无法自动识别某些列的列类型。
我是 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
而且我研究了我需要指定参数的 jdbcType
。 SOlink。还添加了一个 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.Datehttps://ibatis.apache.org/docs/java/pdf/iBATIS-SqlMaps-2_en.pdf
第 26 页,第 jdbcType 节
这是因为 JDBC 驱动程序无法自动识别某些列的列类型。