【发布时间】:2021-10-13 07:53:16
【问题描述】:
我想使用 JPA 条件查询返回 Group 对象列表。组可以为空或包含参与者。每个Participant 都有一个对其Group 的引用。该小组对参与者一无所知。现在我想实现一个条件查询以动态返回:
- 仅限有参与者的小组。
- 所有组(包括空组)。
基本上,这是我的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<Group, Participant>,并通过Group 类的属性加入参与者。
但是,由于我的 reversed 类结构,我不能这样做。上面的代码不起作用,因为我颠倒了类型,JPA 无法通过简单类型加入。我不确定我是否正确地解决了这个问题。
我可以切换类型并将我的Root 基于Participant 类,然后加入Group。但是,这使得有条件地返回空组成为不可能。甚至可以使用 Criteria API 构建纯 SQL 查询吗?
【问题讨论】:
标签: java hibernate jpa left-join criteria-api