Спящий режим и неожиданный конец исключения 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;
}
}
Ответы
Ответ 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
есть ключ. Это, возможно, несколько проще, чем предложение Юрия, поскольку оно избегает явного соединения.