我正在用H2测试内存中数据库的Dao。我将一个int传递给查询,并使用一个映射来执行它。此查询在Oracle上运行良好,但在H2中不成功。
DAO
@Override
public int deleteCancelled(int days) {
final Map<String, Object> namedParameters = new HashMap<String, Object>();
namedParameters.put(DAYS, days);
namedParameters.put(STATUS, StatusEnum.CANCELLED.toString());
int updated = this.namedParameterJdbcTemplate.update(Query.QUERIES.DELETE_CANCELLED, namedParameters);
return updated;
}查询
public static final String DELETE_CANCELLED = "DELETE FROM MY_TABLE "
+ "WHERE UPDATE_TS < SYSDATE - :days AND STATUS = :status";当我试图在H2上执行这个查询时,它返回:
误差
org.springframework.jdbc.UncategorizedSQLException:
PreparedStatementCallback; uncategorized SQLException for SQL [DELETE FROM
MY_TABLE WHERE UPDATE_TS < SYSDATE - ? AND STATUS = ?]; SQL state
[HY004]; error code [50004]; Unknown data type : "?"
Unknown data type: "?"; SQL statement:
DELETE FROM MY_TABLE WHERE UPDATE_TS < SYSDATE - ? AND STATUS = ?
[50004-196]; nested exception is org.h2.jdbc.JdbcSQLException: Unknown data
type : "?"
Unknown data type: "?"; SQL statement:
DELETE FROM MY_TABLE WHERE UPDATE_TS < SYSDATE - ? AND STATUS = ?
[50004-196]我尝试执行在查询(SYSDATE = 4)中硬编码int的查询,它成功了,还尝试将原始int封装到Integer.valueOf(days)中,并使用MapSqlParameterSource来指定哪种数据类型,但两者都不起作用。
为什么不起作用?有人知道吗?提前谢谢。
编辑:
StatusEnum
public enum StatusEnum {
CANCELLED("Cancelled"),
CONFIRMED("Confirmed"),
PENDING("Pending"),
SENT("Sent"),
private final String text;
/**
* @param text
*/
private StatusEnum(final String text) {
this.text = text;
}
/* (non-Javadoc)
* @see java.lang.Enum#toString()
*/
@Override
public String toString() {
return text;
}}
发布于 2018-08-17 11:59:00
出现此异常似乎是因为H2试图在编译时键入-检查语句,并且无法唯一地确定参数的类型:它可以是日期,也可以是数字,或者是其他什么东西。
解决方法(在我提出的GitHub问题中提供)是替换
SYSDATE - ?使用
SYSDATE - CAST(? AS INTEGER)我已经检查过了,它在H2和甲骨文上都有效。
发布于 2019-09-18 19:05:18
对于整数param (Spring ),有解决办法:拥抱参数并添加0
@Query(value = "DELETE FROM my_table WHERE update_ts < SYSDATE - (:days + 0)")
void cleanup(@Param("days") Integer days);发布于 2020-11-27 15:55:38
我正在使用namedQuery,这对我来说是有效的。如果它能帮助别人。
CAST(:variable AS double)必须是小写才能尊重hibernate类型:单/#映射.类型.基本类型
“路克”的解决方案正在起作用,但我不得不改用小写。
https://stackoverflow.com/questions/51892300
复制相似问题