web-dev-qa-db-ja.com

ハイバネートおよび予期しないサブツリーの終わりの例外

私は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;
       }
 }
22
Scott Fines

プリミティブコレクションの場合、次のようなHQLクエリを使用する必要があります。

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

PS: 'joins'は 'labels'がOneToManyまたはManyToManyバリアントであるため必要です、 'lbls'はコレクションであるため括弧が必要です

7
Yuri.Bulkin

グーグル検索から、パラメーターコレクションが空のようです。クエリを呼び出す前に空のチェックを追加します。

教訓は、グーグルはあなたの友達だということです。エラーメッセージがわからない場合は、Google(またはお気に入りのエンジン)に入力してみてください。混乱した最初の人になる可能性はほとんどありません。

50
PanCrit

バグに関するコメント HHH-5209 に基づいています。これは、類似のJPQLクエリからスローされるのとほぼ同じ例外であり、正しい形式は次のとおりです。

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

elements関数にはキーがあります。これは、明示的な結合を回避するため、おそらくYuriの提案よりも少し単純です。

1
Tom Anderson

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'

お役に立てれば :)

1
jtbradle