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にフェッチタイプを変更することなく、私が欲しいと、それは動作しますが、それは可能です? ありがとうございます。
これは動作しませんか? 'ユーザーからuを選んでください。u.roles join u.roles r WHERE r.roleCode like:roleName'。あなたのために働くなら、私はjpqlの詳細について質問に答えます。 – Dherik
はい、これは現在動作しています、ありがとう – Emeres