PostgreSQL函数round和JPA / Hibernate

时间:2016-06-11 04:39:29

标签: postgresql jpa hibernate-mapping

我有一个从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?

1 个答案:

答案 0 :(得分:0)

您正在使用Query query = getEntityManager().createQuery(hql);调用jpql - 查询,该查询不支持round(v numeric, s integer)等所有数据库函数。

两个建议:

  1. 使用BETWEEN并维护jpql-mapping
  2. 编写NativeQuery - > Query query = em.createNativeQuery(queryString);
  3. 您的queryString只需要通过参数进行更改。