代码之家  ›  专栏  ›  技术社区  ›  egbokul

从很多关系中返回一个列表?

  •  1
  • egbokul  · 技术社区  · 15 年前

    我用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;
    

    更糟糕的是,我有自己的类,我想用它在JSF页面上显示结果。以下是当前查询:

    Query query = em.createQuery("SELECT NEW UserListQueryObject"
            + "(u.userName, ...)"
            + " FROM Users u",
            UserListQueryObject.class);
    List<UserListQueryObject> users = query.getResultList();
    

    它适用于简单的属性和一对一的关系。但对很多人来说不是。我试着这样加入:

    Query query = em.createQuery("SELECT NEW UserListQueryObject"
            + "(u.userName, ...., r.roleName)"
            + " FROM Users u JOIN u.rolesCollection r",
            UserListQueryObject.class);
    

    ... 但是运行时抱怨“r”附近的语法不好,还抱怨r.roleName。它想返回一个角色,但我需要一个用户的所有角色!

    我也不是SQL专家,所以很可能解决方案很简单。。。还是在读了“专业jpa2…”这本书之后,我被卡住了。谢谢你的帮助。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Pascal Thivent    15 年前

    我想在一个表中列出所有用户,以及每个用户的所有角色。(…)

    加入获取

    SELECT u FROM Users u JOIN FETCH u.rolesCollection
    

    这将执行内部联接,这意味着这将从结果集中筛选没有角色的任何用户。

    要避免上述行为,请使用外部联接:

    SELECT u FROM Users u LEFT JOIN FETCH u.rolesCollection