首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在NamedParameterJDBCTemplate上使用H2 [SPRING]上的整数时,未知的数据类型

在NamedParameterJDBCTemplate上使用H2 [SPRING]上的整数时,未知的数据类型
EN

Stack Overflow用户
提问于 2018-08-17 09:26:12
回答 3查看 4.3K关注 0票数 11

我正在用H2测试内存中数据库的Dao。我将一个int传递给查询,并使用一个映射来执行它。此查询在Oracle上运行良好,但在H2中不成功。

DAO

代码语言:javascript
复制
    @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;
}

查询

代码语言:javascript
复制
      public static final String DELETE_CANCELLED = "DELETE FROM MY_TABLE "
      + "WHERE UPDATE_TS < SYSDATE - :days AND STATUS = :status";

当我试图在H2上执行这个查询时,它返回:

误差

代码语言:javascript
复制
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

代码语言:javascript
复制
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;
}

}

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-17 11:59:00

出现此异常似乎是因为H2试图在编译时键入-检查语句,并且无法唯一地确定参数的类型:它可以是日期,也可以是数字,或者是其他什么东西。

解决方法(在我提出的GitHub问题中提供)是替换

代码语言:javascript
复制
SYSDATE - ?

使用

代码语言:javascript
复制
SYSDATE - CAST(? AS INTEGER)

我已经检查过了,它在H2和甲骨文上都有效。

票数 10
EN

Stack Overflow用户

发布于 2019-09-18 19:05:18

对于整数param (Spring ),有解决办法:拥抱参数并添加0

代码语言:javascript
复制
@Query(value = "DELETE FROM my_table WHERE update_ts < SYSDATE - (:days + 0)")
void cleanup(@Param("days") Integer days);
票数 3
EN

Stack Overflow用户

发布于 2020-11-27 15:55:38

我正在使用namedQuery,这对我来说是有效的。如果它能帮助别人。

代码语言:javascript
复制
CAST(:variable AS double)

必须是小写才能尊重hibernate类型:单/#映射.类型.基本类型

“路克”的解决方案正在起作用,但我不得不改用小写。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51892300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档