PostgreSQL function round and JPA/Hibernate



我有一个从java应用程序执行的查询,如下所示:

Query query = getEntityManager().createQuery(hql);

查询如下:

String hql = "select * from table a where round(column1, 3) = round(parameter, 3)";

这里CCD_ 1是类型CCD_。它所保持的值类似于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请求的类型:numeric

也尝试过Query query = getEntityManager().createNativeQuery(hql);这将导致一个新的错误。

org.hibernate.engine.jdbc.spi.SqlExceptionHelper-错误:"where"处或附近的语法错误

如果我进行调试,则在执行下面的行时会出错。

List resultList = query.getResultList();

我该如何重写查询,使其适用于Postgres?

您使用Query query = getEntityManager().createQuery(hql);所做的是调用一个jpql-查询,它不支持像round(v numeric, s integer)这样的所有数据库函数。

两个建议:

  1. 使用BETWEEN并维护jpql映射
  2. 编写NativeQuery->column10

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

最新更新