【问题标题】:Reverse types in JOIN query with JPA Criteria API使用 JPA Criteria API 在 JOIN 查询中反转类型
【发布时间】:2021-10-13 07:53:16
【问题描述】:

我想使用 JPA 条件查询返回 Group 对象列表。组可以为空或包含参与者。每个Participant 都有一个对其Group 的引用。该小组对参与者一无所知。现在我想实现一个条件查询以动态返回:

  1. 仅限有参与者的小组。
  2. 所有组(包括空组)。

基本上,这是我的Group 课程:

public class Group {
  private long id;
}

这是我的Participant

public class Participant {
  @ManyToOne
  @JoinColumn(name = "FK_GROUP")
  private Group group;
}

为了简单起见,我省略了所有属性、方法和注释。

这将在纯 SQL 中返回空组和包含参与者的组:

SELECT DISTINCT G.* FROM GROUP_TABLE G
  LEFT JOIN PARTICIPANT_TABLE P ON P.FK_GROUP=G.ID;

现在我想用 Criteria API 做同样的事情:

if (includeEmptyGroups) {
  // ...
  Root<Group> root = criteria.from(Group.class);
  Join<Participant, Group> join = root.join("id"); <-- This is my issue!
  criteria.select(root).distinct(true);
  //...
}
else {
  // ...
}

查询应该返回Group 对象的列表,因此我为Root 对象和from() 方法选择了该类型。现在,大多数教程会定义一个Join&lt;Group, Participant&gt;,并通过Group 类的属性加入参与者。

但是,由于我的 reversed 类结构,我不能这样做。上面的代码不起作用,因为我颠倒了类型,JPA 无法通过简单类型加入。我不确定我是否正确地解决了这个问题。

我可以切换类型并将我的Root 基于Participant 类,然后加入Group。但是,这使得有条件地返回空组成为不可能。甚至可以使用 Criteria API 构建纯 SQL 查询吗?

【问题讨论】:

    标签: java hibernate jpa left-join criteria-api


    【解决方案1】:

    由于 JPA 合同不允许左连接实体,您只能使用 HQL 或在 HQL 之上的查询构建器 API,例如Blaze-Persistence 支持这一点。无论哪种方式,您至少需要 Hibernate 5.1,这是第一个添加了对实体连接的支持的版本。

    【讨论】:

      猜你喜欢
      • 2013-06-21
      • 2011-10-17
      • 2012-08-19
      • 1970-01-01
      • 2021-12-22
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      相关资源
      最近更新 更多