Будьте в спящем режиме и Неожиданный конец исключения Поддерева

Я - новичок для Спящего режима.

Я имею Item POJO, который содержит a Set<String> состоя из маркировок. Маркировки содержатся на другой Таблице базы данных от Item таблица, таким образом, я делаю соединение для заполнения pojo.

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

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

Что могло бы вызывать эту проблему?

Вот мои POJOs:

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

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

       @CollectionOfElements
       @JoinTable(name="labels", joinColumns=@JoinColumn(name="uuid"))
       @Column(name="label")
       public Set<String> getLabels(){
            return labels;
       }
 }
22
задан ROMANIA_engineer 20 October 2017 в 21:05
поделиться

3 ответа

Для коллекций примитивов необходимо использовать HQL-запрос вида:

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

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

.
7
ответ дан 29 November 2019 в 03:55
поделиться

От Googlet вокруг, кажется, что ваша коллекция параметров может быть пустой. Я бы добавил пустой чек перед вызовом запроса.

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

49
ответ дан 29 November 2019 в 03:55
поделиться

Член команды в 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'

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

.
1
ответ дан 29 November 2019 в 03:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: