我有一个从java应用程序执行的查询,如下所示:
Query query = getEntityManager().createQuery(hql);
查询如下所示:
String hql = "select * from table a where round(column1, 3) = round(parameter, 3)";
此处column1
的类型为Double
。它拥有的值就像143.02856666
。我需要按原样保留值,但对于某些业务逻辑,只需要进行舍入和比较。
配置的初始数据库是H2,这很好。现在数据库已更改为Postgres,此查询现在出错了。
错误:函数round(双精度,整数)不存在提示:没有函数匹配给定的名称和参数类型。你可能会 需要添加显式类型转换。
Postgres中的round()
函数采用数值数据类型并需要强制转换。
如果直接在Postgres控制台中执行,则以下查询可以正常工作。
select * from table a where round(cast(column1 as numeric), 3) = round(cast(parameter as numeric), 3);
同样来自java应用程序的错误。
java.lang.IllegalArgumentException:org.hibernate.QueryException:无法解析CAST请求的类型:数字
还尝试了Query query = getEntityManager().createNativeQuery(hql);
这会导致新的错误。
org.hibernate.engine.jdbc.spi.SqlExceptionHelper - 错误:语法错误在或附近"其中"
如果我调试,则在执行以下行时会出错。
List resultList = query.getResultList();
如何重写查询以使其适用于Postgres?
答案 0 :(得分:0)
您正在使用Query query = getEntityManager().createQuery(hql);
调用jpql
- 查询,该查询不支持round(v numeric, s integer)
等所有数据库函数。
两个建议:
BETWEEN
并维护jpql-mapping Query query = em.createNativeQuery(queryString);
您的queryString
只需要通过参数进行更改。