从ManyToMany关系中返回一个列表?

时间:2010-06-28 14:23:22

标签: java-ee jpql jpa-2.0

我有两个表:用户和角色。用户可能拥有更多角色,因此这是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。我试着像这样加入:

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 ...”之后,我仍然被困住了。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

  

我想列出表中的所有用户,并为每个用户列出他们拥有的所有角色。 (...)

如果您想在单个查询中阅读多个对象,可以使用 join fetch

SELECT u FROM Users u JOIN FETCH u.rolesCollection

这将执行INNER连接,这意味着这将过滤没有角色的结果集中的任何用户。

要避免上述行为,请使用OUTER join:

SELECT u FROM Users u LEFT JOIN FETCH u.rolesCollection