私はHibernateの初心者です。
ラベルで構成されるSet<String>
を含むItem
POJOがあります。ラベルは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;
}
}
プリミティブコレクションの場合、次のようなHQLクエリを使用する必要があります。
from Item item join item.labels lbls where 'hello' in (lbls)
PS: 'joins'は 'labels'がOneToManyまたはManyToManyバリアントであるため必要です、 'lbls'はコレクションであるため括弧が必要です
グーグル検索から、パラメーターコレクションが空のようです。クエリを呼び出す前に空のチェックを追加します。
教訓は、グーグルはあなたの友達だということです。エラーメッセージがわからない場合は、Google(またはお気に入りのエンジン)に入力してみてください。混乱した最初の人になる可能性はほとんどありません。
バグに関するコメント HHH-5209 に基づいています。これは、類似のJPQLクエリからスローされるのとほぼ同じ例外であり、正しい形式は次のとおりです。
select item from Item item where 'hello' in elements(item.labels)
elements
関数にはキーがあります。これは、明示的な結合を回避するため、おそらくYuriの提案よりも少し単純です。
HQLのcommandのメンバーは、非プリミティブオブジェクトの使用のために予約されています。できることは2つあります。次のように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'
お役に立てれば :)