Hibernate и неожиданный конец исключения поддерева - PullRequest
22 голосов
/ 14 января 2010

Я новичок в Hibernate.

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

Я пытаюсь выполнить простой пример запроса из книги «Java Persistance with 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", joinColumns=@JoinColumn(name="uuid"))
       @Column(name="label")
       public Set<String> getLabels(){
            return labels;
       }
 }

Ответы [ 4 ]

48 голосов
/ 14 января 2010

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

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

7 голосов
/ 15 января 2010

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

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

PS: 'join' требуется, потому что 'tags' - это вариант OneToMany или ManyToMany, скобки требуются, потому что 'lbls' - это коллекция

1 голос
/ 07 июля 2012

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

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

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

1 голос
/ 14 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...