1

ユーザーとロールの 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...」の本を読んだ後でも、行き詰まっています。助けてくれてありがとう。

4

1 に答える 1

0

すべてのユーザーをテーブルに一覧表示し、ユーザーごとにすべてのロールを一覧表示したいと思います。(...)

単一のクエリで複数のオブジェクトを読み取りたい場合は、結合フェッチを使用できます。

SELECT u FROM Users u JOIN FETCH u.rolesCollection

これにより、INNER 結合が実行されます。これは、ロールを持たない結果セットからすべてのユーザーをフィルター処理することを意味します。

上記の動作を回避するには、OUTER 結合を使用します。

SELECT u FROM Users u LEFT JOIN FETCH u.rolesCollection
于 2010-06-28T15:31:47.147 に答える