JPA:在加入之前过滤数据

时间:2012-11-13 07:30:32

标签: java jpa

我有一个经典的用户< - >会员资格< - >集团关系:

@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条件的支持。在那之前,我如何解决这个限制?

1 个答案:

答案 0 :(得分:0)

如果您正在使用EclipseLink,则EclipseLink 2.4中支持ON子句,

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#ON

否则,您可以使用本机SQL查询。