【发布时间】:2016-10-12 02:46:12
【问题描述】:
我有一个从 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(double precision, integer) 不存在 提示:没有函数匹配给定的名称和参数类型。你可能 需要添加显式类型转换。
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 - 错误:“where”或附近的语法错误
如果我调试,执行以下行时会出错。
List resultList = query.getResultList();
如何重写查询以使其适用于 Postgres?
【问题讨论】:
-
parameter是实际参数,表中没有列吗?如果是这样,如果查询字符串从未被操纵,您的查询将如何工作?另外,我刚刚用 Eclipselink 和 Postgres 测试了一个 nativeQuery,它可以工作。我建议您始终将问题简化为基本问题,并为此类问题提供表格定义... -
谢谢,我的坏事会处理的。该参数将传递给执行此查询的方法。它类似于 :parmeter 并将使用 .setParameter("parameter", parameterValue); 传入。
-
我已经通过转换为映射到数字的 big_decimal 解决了这个问题。 round(cast(column1 as numeric), 3) 到 round(cast(column1 as big_decimal), 3)。启用 show_sql 会在控制台中将此查询显示为 round(cast(column1 as numeric(19,2), 3)。任何指针,如果它可以以某种方式编写,以便将 numeric(19,2) 转换为 numeric(19,6) ) 因为这会给我更准确的结果。
标签: postgresql jpa hibernate-mapping