将实体包含在CriteriaBuilder查询的groupBy子句中

时间:2015-05-27 23:40:39

标签: java sql hibernate jpa

考虑以下假设模型:

@Entity
class Parent{

    Integer number;
    Child1 child1;
    Child2 child2;
    String description;
}

@Entity
class Child1{
    Integer id;
}

@Entity
class Child2{
    Integer id;
}

我正在number中构建一个在Parent上执行聚合功能的查询,但我还要显示child1child2,所以我将它们包含在我的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; ?这有什么解决方法吗?

2 个答案:

答案 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>