gpt4 book ai didi

java - JPQL avg 聚合函数是否适用于整数?

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:26 25 4
gpt4 key购买 nike

我有一个名为 Surgery 的 JPA 2 实体。它有一个名为 transfusionUnits 的成员,它是一个 Integer

数据库中有两个条目。执行这个 JPQL 语句:

Select s.transfusionUnits from Surgery s

产生预期的结果:

2
3

以下语句产生5的预期答案:

Select sum(s.transfusionUnits) from Surgery s

我希望以下语句的答案是2.5,但它返回的是2.0

Select avg(s.transfusionUnits) from Surgery s

如果我在不同的 (Float) 成员上执行语句,结果是正确的。关于为什么会发生这种情况的任何想法?我需要在 JPQL 中进行某种转换吗?这可能吗?当然,我在这里遗漏了一些微不足道的东西。

最佳答案

首先,让我总结一下 JPA 2.0 规范对 AVG 的描述(完整内容请参见4.8.5 SELECT 子句中的聚合函数部分)

The AVG function takes a state field path expression as an argument and calculates the average value of the sate field over the group. The state field must be numeric, and the result is returnd as a Double.

因此,在第一次阅读之后,我期待以下片段能够通过:

Query q = em.createQuery("select avg(s.transfusionUnits) from Surgery s");
Double actual = (Double) q.getSingleResult();
assertEquals(2.5d, actual.doubleValue());

但它没有,我得到的是 2.0 结果(一个 Double,但不是预期的结果)。

所以我查看了数据库级别并意识到 SQL 查询实际上没有返回 2.5。事实上,这就是我的数据库文档中关于 AVG 的内容:

The average (mean) value. If no rows are selected, the result is NULL. Aggregates are only allowed in select statements. The returned value is of the same data type as the parameter.

我的期望太高了。 JPA 将以 Double 的形式返回结果,但它不会做任何魔术。如果查询没有返回具有所需精度的结果,您将无法在 Java 级别获得它。

因此,在不更改 transfusionUnits 类型的情况下,我必须运行此 native 查询才能正常运行:

Query q = em.createNativeQuery("SELECT AVG(CAST(s.transfusionUnits as double)) from Surgery s");
Double actual = (Double) q.getSingleResult();
assertEquals(2.5d, actual.doubleValue());

更新:似乎某些数据库(例如 MySQL)在对 INT 列使用 AVG 时确实会返回一个带有小数部分的值(这是有道理的,无论我记录的数据库行为如何这里使用)。对于其他数据库,可以处理上述转换在“方言”中(例如,Hibernate 参见 HHH-5173)以避免使用 JPQL 时数据库之间的可移植性问题。

关于java - JPQL avg 聚合函数是否适用于整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2791378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com