如何按标准对相关实体的属性进行分组?

时间:2010-02-24 20:52:41

标签: java hibernate criteria projection

我正在编写一个标准,应该按相关实体的属性对结果进行分组。我尝试过使用别名,尝试使用属性路径本身,但到目前为止我什么都没得到。 说我的课程是(草图):

class A{
 @ManyToOne(...)
 B b;
}
class B{
 @OneToOne(...)
 C c;
}
class C{
 String s;
}

我想要一个标准,它返回C中每个唯一字符串s的A和B的数量。

我最初的尝试是:

session.createCriteria(A.class)
  .setProjection(Projections.projectionList()
    .add(Projections.groupProperty("b.c.s"), "string")
    .add(Projections.countDistinct("b"), "b's")
    .add(Projections.rowCount(), "a's"))

这没有多大帮助,因为b.c.s不是A的属性。

然后我试了

session.createCriteria(A.class)
  .createAlias("b.c", "al")
  .setProjection(Projections.projectionList()
    .add(Projections.groupProperty("al.s"), "string")
    .add(Projections.countDistinct("b"), "b's")
    .add(Projections.rowCount(), "a's"))

这实际上被翻译成了SQL,但没有达到目的,因为它没有在查询中包含任何连接。

我似乎在做错事。

是否可以使用条件API获得此类有效查询?

1 个答案:

答案 0 :(得分:0)

可能是这样的:

sess.createCriteria(A.class)
    .createCriteria("b")
    .createCriteria("c")
    .setProjection(Projections.projectionList()
    .add(Projections.groupProperty("s"), "string")
    .list()
    .size()

我认为你必须看看双createCriteria()