私は古典的なユーザー <-> メンバーシップ <-> グループ関係を持っています:
@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;
}
現在、既存のすべてのグループに関心があり、さらに、特定のユーザーのメンバーシップ ステータスが存在する場合は知りたいと考えています。結果は、グループ オブジェクトとメンバーシップ オブジェクトのタプル (または、特定のユーザーにメンバーシップが存在しない場合はグループ オブジェクトと 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 条件のサポートが追加されるようです。それまでは、この制限を回避するにはどうすればよいですか?