У меня есть две таблицы: пользователи и роли.У пользователя может быть больше ролей, так что это отношение 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.Но не для многих.Я пытался присоединиться так:
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 ...", я застрял.Спасибо за любую помощь.