【问题标题】:PostgreSQL function round and JPA/HibernatePostgreSQL 函数轮和 JPA/Hibernate
【发布时间】: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)";

这里column1Double 类型。它持有的价值就像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


【解决方案1】:

您对Query query = getEntityManager().createQuery(hql); 所做的是调用jpql 查询,它不支持所有数据库函数,如round(v numeric, s integer)

两个建议:

  1. 使用BETWEEN并维护jpql-mapping
  2. 写一个 NativeQuery -> Query query = em.createNativeQuery(queryString);

您的queryString 只需通过您的参数进行更改。

【讨论】:

  • 感谢您的建议,我确实尝试过使用 createNativeQuery,但没有奏效。问题在于映射数据类型。请看我上面的评论。
猜你喜欢
  • 2011-02-18
  • 2020-03-19
  • 2016-06-26
  • 2011-02-18
  • 2015-05-19
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
相关资源
最近更新 更多