我用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…”这本书之后,我被卡住了。谢谢你的帮助。