ElementCollection createAlias ​​в hibernate API

Кто-нибудь знает, если и как решение для следующего вопроса (которое написано в 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));

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

Ответ 1

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

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

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

Ответ 2

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

Правильное свойство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));

Ответ 3

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

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

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