转换为Date字段时出错:org.springframework.jdbc.BadSqlGrammarException:PreparedStatementCallback;错误的SQL语法

问题描述

我需要如何发送该字段的值,以便正确地对其进行转换。目前,我要发送日期类型为 value-> 2020-10-10
的日期类型字段 这是查询

                 query.append("SELECT * from STUDENT where")
                .append(" CAST(STUDENT.ADM_DTTM AS DATE) BETWEEN")
                .append(" CAST(")
                .append("?")
                .append(" AS DATE) AND")
                .append(" CURRENT_DATE-5 DAY");

             final Date[] args = new Date[]{getMyDate()};
             int[] types = new int[]{Types.DATE};
             result = jdbcTemplate.query(query,args,types,new Mapper());

这是详细的堆栈跟踪:

nested exception is com.ibm.db2.jcc.am.sqlException: DB2 sql Error: sqlCODE=-313,sqlSTATE=07001,sqlERRMC=null,DRIVER=4.19.66
at org.springframework.jdbc.support.sqlStatesqlExceptionTranslator.doTranslate(sqlStatesqlExceptionTranslator.java:101) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.support.AbstractFallbacksqlExceptionTranslator.translate(AbstractFallbacksqlExceptionTranslator.java:72) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.support.AbstractFallbacksqlExceptionTranslator.translate(AbstractFallbacksqlExceptionTranslator.java:81) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.support.AbstractFallbacksqlExceptionTranslator.translate(AbstractFallbacksqlExceptionTranslator.java:81) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1444) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:632) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:669) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:700) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:706) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]

编辑1:添加了传递的参数,以匹配查询中的参数标记数量

 final Date[] args = new Date[]{
            getMyDate(),getMyDate(),getMyDate()
    };
    int[] types = new int[]{Types.DATE,Types.DATE,Types.DATE};

错误

nested exception is com.ibm.db2.jcc.am.sqlSyntaxErrorException: DB2 sql Error: sqlCODE=-401,sqlSTATE=42818,DRIVER=4.19.66
at org.springframework.jdbc.support.sqlExceptionSubclasstranslator.doTranslate(sqlExceptionSubclasstranslator.java:93) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.support.AbstractFallbacksqlExceptionTranslator.translate(AbstractFallbacksqlExceptionTranslator.java:72) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.support.AbstractFallbacksqlExceptionTranslator.translate(AbstractFallbacksqlExceptionTranslator.java:81) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1444) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:632) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:669) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:700) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:706) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]

解决方法

实际上,您在DB2查询中根本不需要任何强制转换:

SELECT *
FROM STUDENT
WHERE ADM_DTTM >= ? AND ADM_DTTM < CURRENT_DATE - 5 DAY;

这样做的原因是,范围比较的下限首先是有效的DB2日期文字。这不需要任何强制转换即可代表日期。其次,由于ADM_DTTM是一个日期时间(大概是日期时间),所以我们不需要强制转换它。如果将其作为日期时间传递,则在转换为日期时也将通过。

我省略了JDBC模板查询的实际更新代码。假设语法已经正确,则上面的查询应该不会给您任何错误。