我有一个经典的 User <-> Membership <-> Group 关系:
@Entity
public class User
{
@Id
private Long id;
private String name;
@OneToMany(mappedBy = "user")
private List<Membership> memberships
}
@Entity
public class Group
{
@Id
private Long id;
private String name;
@OneToMany(mappedBy = "group")
private List<Membership> members;
}
@Entity
public class Membership
{
@Id private Long id;
private String status;
@ManyToOne private User user;
@ManyToOne private Group group;
}
现在我对所有现有组感兴趣,此外还想知道特定用户的会员状态(如果存在)。结果应该是 Group 和 Membership 对象的元组(或 Group 对象,如果特定用户不存在 Membership,则为 null)。在 SQL 中类似于
select g.*, m.* from `group` g left join membership m on g.id = m.group_id and m.user_id = 1
请注意加入谓词中的附加限制and m.user_id = 1
,该限制在加入之前为我感兴趣的会员状态的用户过滤数据。
我似乎找不到用 JPA 做到这一点的方法。据我所知,JPA 无法在连接中进行子选择,并且无法直接在 JPQL 中编写类似上述内容。
看来我在这里完全走错了路,如果有对此有新看法的人能给我指点,我将不胜感激。
更新:
JSR 338 (JPA 2.1)似乎会增加对 ON 条件的支持。在那之前,我该如何解决这个限制?