我有一个经典的用户< - >会员资格< - >集团关系:
@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对象的元组(或组对象,如果特定用户不存在成员资格,则为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条件的支持。在那之前,我如何解决这个限制?
答案 0 :(得分:0)
如果您正在使用EclipseLink,则EclipseLink 2.4中支持ON子句,
http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#ON
否则,您可以使用本机SQL查询。