Я - новичок для Спящего режима.
Я имею 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;
}
}
Для коллекций примитивов необходимо использовать HQL-запрос вида:
from Item item join item.labels lbls where 'hello' in (lbls)
PS: "join", потому что "labels" - вариант OneToMany или ManyToMany, скобки нужны, потому что "lbls" - коллекция
.От Googlet вокруг, кажется, что ваша коллекция параметров может быть пустой. Я бы добавил пустой чек перед вызовом запроса.
Урок в том, что Google - ваш друг. Когда вы не можете выяснить сообщение об ошибке, попробуйте ввести его в Google (или ваш любимый двигатель.) Вы вряд ли будете первым, кто был смущен им.
Член команды в 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'
Надеюсь, это поможет :)
.