考虑以下假设模型:
@Entity
class Parent{
Integer number;
Child1 child1;
Child2 child2;
String description;
}
@Entity
class Child1{
Integer id;
}
@Entity
class Child2{
Integer id;
}
我正在number
中构建一个在Parent
上执行聚合功能的查询,但我还要显示child1
和child2
,所以我将它们包含在我的Tuple
中标准构建器中的group by子句。出于其他一些随机原因,我正在创建CriteriaQuery<Tuple> cq = cb.createTupleQuery();
Root<Parent> root = cq.from(Parent.class);
cq.select(cb.tuple(root.get("description"),
root.get("child1")
cb.count(root.get("number")));
cq.groupBy(root.get("description"),
root.get("child1")));
查询。
Parent
当我执行此查询时,我收到错误:&#34; child1.id包含在SELECT中但不包含在group by clasue中,并且不是聚合函数的一部分&#34;。每当我从实体Parent
中选择不是实体本身的字段时,我就没有问题。一旦我尝试从类cq.groupBy(root.get("description"),
root.get("child1").get("id")));
中选择一个本身就是实体的字段,那么即使我将它包含在group by子句中,我也遇到了麻烦。我甚至试过没有运气这样做:
CriteriaQuery
如何创建能够完成我想做的float a;
?这有什么解决方法吗?
答案 0 :(得分:0)
我们必须对表中的所有字段使用聚合函数,但正在执行group by的字段除外。 因此,在您的情况下,您只能使用以下函数从实体中选择值。
AVG() - Returns the average value.
COUNT() - Returns the number of rows.
FIRST() - Returns the first value.
LAST() - Returns the last value.
MAX() - Returns the largest value.
MIN() - Returns the smallest value.
SUM() - Returns the sum.
您不能将数字分组并选择没有聚合函数的child1。 希望这会有所帮助。
答案 1 :(得分:0)
为了实现它,显然需要显式连接,以便当标准查询转换为JPA时,正确的字段被识别为存在。我实现它的方式如下:
<DigitalPrintingParams RunIndex="0 1 3 4 6 7 9 10">
<MediaRef rRef="media_0_size_from_catalog" />
</DigitalPrintingParams>
<DigitalPrintingParams RunIndex="2 5 8 11">
<MediaRef rRef="media_1_size_from_catalog" />
</DigitalPrintingParams>
<DigitalPrintingParams RunIndex="12 13 15 16 18 19">
<MediaRef rRef="media_0_size_from_catalog" />
</DigitalPrintingParams>
<DigitalPrintingParams RunIndex="14 17 20">
<MediaRef rRef="media_1_size_from_catalog" />
</DigitalPrintingParams>