ユーザーとロールの 2 つのテーブルがあります。ユーザーはより多くのロールを持つことができるため、これは ManyToMany の関係です。Netbeans を使用してエンティティ クラスを生成したところ、次のようになります。
@Table(name = "users")
public class Users implements Serializable {
@Id
@Basic(optional = false)
@Column(name = "user_name")
private String userName;
@JoinTable(name = "user_roles", joinColumns = {
@JoinColumn(name = "user_name", referencedColumnName = "user_name")}, inverseJoinColumns = {
@JoinColumn(name = "role_name", referencedColumnName = "role_name")})
@ManyToMany(fetch = FetchType.LAZY)
private Collection<Roles> rolesCollection;
(等)
@Table(name = "roles")
public class Roles implements Serializable {
@Id
@Basic(optional = false)
@Column(name = "role_name")
private String roleName;
@ManyToMany(mappedBy = "rolesCollection", fetch = FetchType.LAZY)
private Collection<Users> usersCollection;
ここに私の問題があります: テーブル内のすべてのユーザーを一覧表示し、各ユーザーのすべてのロールを一覧表示したいと考えています。解決策を思いつきませんでした。JPQL内からコレクションを参照するにはどうすればよいですか? コレクションを返却するにはどうすればよいですか? これはまったく可能ですか?
さらに悪いことに、JSF ページに結果を表示するために使用したい独自のクラスがあります。現在のクエリは次のとおりです。
Query query = em.createQuery("SELECT NEW UserListQueryObject"
+ "(u.userName, ...)"
+ " FROM Users u",
UserListQueryObject.class);
List<UserListQueryObject> users = query.getResultList();
これは、単純な属性と OneToOne の関係に対して機能します。ただし、ManyToMany ではありません。私はこのようにJOINしてみました:
Query query = em.createQuery("SELECT NEW UserListQueryObject"
+ "(u.userName, ...., r.roleName)"
+ " FROM Users u JOIN u.rolesCollection r",
UserListQueryObject.class);
...しかし、ランタイムは "r" の近くの不適切な構文と、r.roleName について不平を言いました。そして、単一のロールを返したかったのですが、ユーザーのすべてのロールが必要です!
私もSQLの専門家ではないので、解決策は単純である可能性は十分にあります...「Pro JPA 2...」の本を読んだ後でも、行き詰まっています。助けてくれてありがとう。