【问题标题】:how do I group by a property of a related entity in a criteria?如何按条件中相关实体的属性进行分组?
【发布时间】:2010-02-24 20:52:40
【问题描述】:

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

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 获得这种高效的查询?

【问题讨论】:

    标签: java hibernate criteria projection


    【解决方案1】:

    可能是这样的:

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

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

    【讨论】:

    • 是的,我大部分时间都使用它两次,但三次它必须工作相同。我没有检查上面的代码,但你可以试一试
    • 我的意思是,我不能在相同的标准中计算 A 和 B? (答案是 10 倍,顺便说一句)
    • 我想你可以。您可以进行投影,然后计算列表。然后您可以使用 resulttransformer hibernate.org/hib_docs/v3/api/org/hibernate/transform/… 撤消投影
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    相关资源
    最近更新 更多