ElementCollection createAlias ​​в спящем API - PullRequest
14 голосов
/ 02 февраля 2011

Кто-нибудь знает, если и как решение для следующего вопроса (которое написано в API JPA) может быть написано с использованием API критериев гибернации?

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

@ElementCollection
@Column(name = "user_name")
@CollectionTable(name = "DISCUSSION_USER", joinColumns = @JoinColumn(name = "DISCUSSION_ID"))
@OrderColumn(name = "ORDER_INDEX")
private List<String> participants = new ArrayList<String>();

Теперь мне нужно получить все обсуждения, в которых данное имя пользователя является участником.

Если ясоздал бы сущность для Участника, это было бы просто:

    Criteria crit = getSession().createCriteria(Discussion.class);
    crit.createAlias("participants", "p");
    crit.add(Restrictions.eq("p.userName", portalUsername));

Но я не могу создать псевдоним с не сущностью ...

Ответы [ 3 ]

27 голосов
/ 17 мая 2012

Поздний ответ.

Правильное свойство name для коллекции (аннотировано @ ElementCollection ) равно "elements" или константе CollectionPropertyNames # COLLECTION_ELEMENTS .

Попробуйте со следующими ответами

Criteria crit = getSession().createCriteria(Discussion.class);
crit.createAlias("participants", "p");

crit.add(Restrictions.eq("p.elements", portalUsername));

или используйте константу COLLECTION_ELEMENTS вместо

crit.add(Restrictions.eq("p." + CollectionPropertyNames.COLLECTION_ELEMENTS, portalUsername));
2 голосов
/ 02 марта 2011

Как объяснено здесь то, что я хотел, невозможно:

Ограничения использования ElementCollection вместо OneToMany заключаются в том, что целевые объекты нельзя запрашивать, сохранять, объединять независимо от их родительского объекта. Они являются строго частными (зависимыми) объектами, такими же, как встроенное отображение. В ElementCollection отсутствует каскадная опция, целевые объекты всегда сохраняются, объединяются, удаляются вместе со своим родителем.

Итак, вместо этого я использовал OneToMany.

1 голос
/ 22 февраля 2011

Можете ли вы дать нам более полную схему и запрос?

Кроме того, Criteria API отстой.Попробуйте использовать QueryDSL, ваш запрос может выглядеть так:

HibernateQuery q=new HibernateQuery(getSession())
.from(QDiscussion.discussion).from(QDocument.document)
.where(QDocument.document.userName.in(QDiscussion.discussion.userNames))
.list(QDocument.document);
...