2016-03-21 9 views
1

私は2つのテーブルを持っています:ManyToMany関係のユーザとロール。JPA2(JPQL)のManyToMany選択クエリ

@Entity 
@Table(name = "user") 
public class User implements Serializable { 

    @Id 
    @Column(name = "user_id") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long userId; 

    @ManyToMany 
    @JoinTable(name = "user_role", 
      joinColumns = @JoinColumn(name = "user_id"), 
      inverseJoinColumns = @JoinColumn(name = "role_id")) 
    private Set<Role> roles; 

//getters, setters 
} 

@Entity 
@Table(name = "role") 
public class Role implements Serializable { 

    @Id 
    @Column(name = "role_id") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long roleId; 

    @Column(name = "role_code") 
    private String roleCode; 


    @ManyToMany(mappedBy = "roles") 
    @JsonIgnore 
    private Set<User> users; 

//getters,setters 

} 

私は、ユーザーが、例えばロール「ROLE_USER」を持っている場合は、すべてのユーザーおよびすべての彼の役割を選択します。

私はnative sqlでそれを行いましたが、JPQLまたはCriteriaQueryを使用したいと思います。

(サブクエリに私がフェッチ結合を使用することはできませんbecouse EAGERに、以前のフェッチタイプの変更)私はJPQLで試してみました:

public List<User> findUsersByRole(String roleName, int startNumber, int endNumber) { 
    Query q = em.createQuery("select u from User u join fetch u.roles r WHERE u.userId in (SELECT uu.userId FROM User uu join uu.roles rr WHERE rr.roleCode like :roleName)") 
      .setParameter("roleName", roleName) 
      .setFirstResult(startNumber) 
      .setMaxResults(endNumber); 
    return q.getResultList(); 
} 

とEAGERにフェッチタイプを変更することなく、私が欲しいと、それは動作しますが、それは可能です? ありがとうございます。

+0

これは動作しませんか? 'ユーザーからuを選んでください。u.roles join u.roles r WHERE r.roleCode like:roleName'。あなたのために働くなら、私はjpqlの詳細について質問に答えます。 – Dherik

+0

はい、これは現在動作しています、ありがとう – Emeres

答えて

0

あなたは行うことができます。

public List<User> findUsersByRole(String roleName, int startNumber, int endNumber) { 
    Query q = em.createQuery("select u from User u join fetch u.roles join u.roles r WHERE r.roleCode like :roleName") 
      .setParameter("roleName", roleName) 
      .setFirstResult(startNumber) 
      .setMaxResults(endNumber); 
    return q.getResultList(); 
}