I'm a newbie to Hibernate.
I have an Item
POJO which contains a Set<String>
consisting of labels. The labels are contained on another Database table from the Item
table, so I do a join to populate the pojo.
I'm trying to run a simple example query from the book "Java Persistance with Hibernate" where I query from Item item where 'hello' member of item.labels
. Only, for some reason I am getting a
`org.hibernate.hql.ast.QuerySyntaxException: unexpected end of subtree[from /*qualified class path*/.Item item where 'hello' member of item.labels]`
What might be causing this issue?
Here are my 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;
}
}
Based on the comments on the bug HHH-5209, which is about the same exception being thrown from a similar JPQL query, i believe the correct form here is:
The
elements
function there is the key. This is perhaps slightly simpler than Yuri's suggestion, because it avoids the explicit join.The member of command in the HQL is reserved for the use of non-primitive objects. There are two things you can do. You can either create a
SQLQuery
as follows:Or you can create a class called
Label
and do the following in your HQL:Hope this helps :)
For primitives collections you should use HQL query like this:
PS: 'join' is required because 'labels' is OneToMany or ManyToMany variant, parentheses are required because 'lbls' is a collection
From googling around, it appears that your parameter collection may be empty. I'd add an empty check before calling the query.
The lesson is that Google is your friend. When you can't figure out an error message, try typing it into Google (or your favorite engine.) You are unlikely to be the first person to have been confused by it.