【问题标题】:Hibernate: group by & having criteriaHibernate:按条件分组
【发布时间】:2018-06-05 13:51:13
【问题描述】:

我的数据库中有以下实体:

  • Ticket
  • TicketEntry

每个TicketEntry 引用一个Ticket 并且1 个Ticket 有0 个或多个票证条目。我试图弄清楚如何检索所有具有 1 TicketEntry 的票。我已经将 SQL 脚本放在一起,但我不知道如何将其转换为 Hibernate Criteria Restrictions。

SELECT ticket_id FROM ticket_entries
GROUP BY ticket_id
HAVING count(ticket_id) = 1;

提前致谢

【问题讨论】:

  • 我实际上是指标准限制。我不想编辑这个问题,因为它已经有 2 个答案。
  • 小心链接其他持久性提供程序的文档作为记录 Hibernate 行为的一种手段,而实际上它可能并不总是准确地表示如何在其他提供程序中执行此操作。
  • @Ferre12 必须使用已弃用的 Hibernate Criteria API 吗?用 HQL 编写这个查询会容易得多。
  • 我真的没有选择,因为我正在建立其他标准,所以是的,我会很感激。
  • 没关系,我都提供了。我不确定您目前使用的是哪个版本的 Hibernate,但请注意旧的 Criteria API 已被弃用并计划很快删除。强烈建议使用 JPA Criteria 或 JPQL/HQL 作为替代方案。

标签: java hibernate orm hibernate-criteria


【解决方案1】:

根据您的帖子,我将假设您的实体模型类似于以下内容

@Entity
public class Ticket {
  /* other attributes */

  @OneToMany(mappedBy = "ticket")
  private List<TicketEntry> entries;
}

@Entity
public class TicketEntry {
  /* other attributes */

  @ManyToOne
  private Ticket ticket;
}

如果您希望使用 Hibernate Criteria API,您可以使用:

Restrictions.sizeEq( "entries", 1 )

您可以使用 Hibernate HQL 执行此操作,如下所示

SELECT t FROM Ticket t WHERE size(t.entries) = 1

HQL 中特殊的size() 函数测试集合的大小。

在这两种情况下,这里的假设是 sizeEqsize() 被应用到的查询的根是父 Ticket,以便满足您想要所有只有 @ 的 Ticket 987654329@条目。

【讨论】:

    猜你喜欢
    • 2011-01-05
    • 1970-01-01
    • 2017-06-04
    • 2022-12-16
    • 2014-12-08
    • 1970-01-01
    • 2021-10-09
    • 2021-09-16
    • 2018-12-03
    相关资源
    最近更新 更多