我有两个表:用户和角色。用户可能拥有更多角色,因此这是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 ...”之后,我仍然被困住了。谢谢你的帮助。
答案 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