Подтвердить что ты не робот

Спящий режим и неожиданный конец исключения Subtree

Я новичок в Hibernate.

У меня есть Item POJO, который содержит Set<String>, состоящий из меток. Этикетки содержатся в другой таблице базы данных из таблицы Item, поэтому я делаю соединение для заполнения pojo.

Я пытаюсь запустить простой пример из книги "Перспектива Java с Hibernate", где я запрашиваю from Item item where 'hello' member of item.labels. Только, по какой-то причине я получаю

 `org.hibernate.hql.ast.QuerySyntaxException: unexpected end of subtree[from /*qualified class path*/.Item item where 'hello' member of item.labels]`

Что может быть причиной этой проблемы?

Вот мои POJO:

public class Item
       private int uuid;
       private Set<String>labels = new HashSet<String>();

       @Id
       public int getUuid(){
          return uuid; 
       }

       @CollectionOfElements
       @JoinTable(name="labels", [email protected](name="uuid"))
       @Column(name="label")
       public Set<String> getLabels(){
            return labels;
       }
 }
4b9b3361

Ответ 1

Для коллекций примитивов вы должны использовать запрос HQL следующим образом:

from Item item join item.labels lbls where 'hello' in (lbls)

PS: "join" требуется, потому что "label" - это вариант OneToMany или ManyToMany, скобки необходимы, потому что "lbls" - это коллекция

Ответ 2

Из поиска googling, кажется, что ваш набор параметров может быть пустым. Я должен добавить пустой чек, прежде чем вызывать запрос.

Урок состоит в том, что Google - ваш друг. Когда вы не можете найти сообщение об ошибке, попробуйте ввести его в Google (или ваш любимый движок). Вероятно, вы вряд ли будете его первым путать.

Ответ 3

Член команды в HQL зарезервирован для использования не примитивных объектов. Есть две вещи, которые вы можете сделать. Вы можете создать SQLQuery следующим образом:

SQLQuery sQuery = session.createSQLQuery("select * 
                                          from item_table it 
                                          inner join label_table lt 
                                          where it.id = lt.item_id 
                                          and lt.label = 'hello'");
sQuery.list();

Или вы можете создать класс с именем Label и сделать следующее в своем HQL:

from Item item, Label label
where label member of item.labels
      and label.label = 'hello'

Надеюсь, что это поможет:)

Ответ 4

Исходя из комментариев об ошибке HHH-5209, которая представляет собой то же самое исключение, которое вызывается из аналогичного запроса JPQL, я считаю, что правильная форма:

select item from Item item where 'hello' in elements(item.labels)

В функции elements есть ключ. Это, возможно, несколько проще, чем предложение Юрия, поскольку оно избегает явного соединения.