Возвращать список из отношений ManyToMany? - PullRequest
1 голос
/ 28 июня 2010

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

1 Ответ

0 голосов
/ 28 июня 2010

Я хотел бы перечислить всех пользователей в таблице и для каждого пользователя все роли, которые у них есть. (...)

Если вы хотите прочитать несколько объектов в одном запросе, вы можете использовать извлечение соединения :

SELECT u FROM Users u JOIN FETCH u.rolesCollection

Это выполнит ВНУТРЕННЕЕ объединение, что означает, что это будет фильтровать всех пользователей из набора результатов, у которых не было ролей.

Чтобы избежать вышеуказанного поведения, используйте OUTER join:

SELECT u FROM Users u LEFT JOIN FETCH u.rolesCollection
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...