休止状態の基準-n:m関係のテーブルのクエリ
-
03-07-2019 - |
質問
次のシナリオの休止状態基準を使用してクエリを作成しようとしています:
- 2つのエンティティ:インジケーターとレポート(それぞれ独自のテーブル、クラスなど)
- インジケータは、ゼロから多数のレポートで使用できます
- レポートはゼロから多くのインジケータを使用します
- したがって、リレーションシップを保存するインターセクションテーブルがあります
- 関係は両方のクラスとその休止状態マッピングで定義されます
- UIで、ユーザーは(特に)1つまたは複数のレポートを選択できます。これらのレポートで使用されるインジケーターをDBに照会したい
次のことを試しました:
criteria.add(Restrictions.in("Reports", selectedReports));
しかし、私が得るのは、奇妙なSQLステートメントだけです
where this_.Indicator_ID in (?)
次にJDBC例外(パラメーターが欠落)
アイデアはありますか?ありがとう。
注: Hibernate Criteriaを使用したManyToManyrelationshipのクエリを調べました。しかし、そこに受け入れられている解決策は、カスタムのSQL文字列を構築することです...
解決
Criteria c = session.createCriteria(Indicator.class);
c.add(Restrictions.eq("someField", myObject).createCriteria("reports")
.add(Restrictions.eq("reportName", name);
c.list();
他のエンティティのコレクションに保持されているエンティティのサブ基準を作成する必要があります。
String[] selectedReportsId = {"1", "2", "3"};
c.add(Restrictions.eq("someField",myObject).createCriteria("reports")
.add(Restrictions.in("id", selectedReportsId);
次に、ここからの結果の変換に関するビットをチェックしてください。 https:// docs。 jboss.org/hibernate/orm/3.3/reference/en-US/html/querycriteria.html#querycriteria-associations
また、これはあなたが基準で何ができるかについていくらかの光を当てるかもしれません: http://www.hibernate.org/hib_docs/ v3 / api / org / hibernate / criterion / Restrictions.html
他のヒント
必要に応じて、「hibernate hql many-to-many」を検索した後にGoogleが提案したいくつかの提案を次に示します。
http://patf.net /blogs/index.php?blog=2&c=1&more=1&pb=1&tb=1&title=many_to_many_in_hql
そしてHibernateフォーラムから:
http://forum.hibernate.org/viewtopic.php?p = 2340747& sid = d4c8d2fcc16aed0201f73eb74619692a
そしてSpringフォーラムから:
http://forum.springframework.org/showthread.php?t=36870
これらのヘルプを期待してください。
今のところ、これが動作するようになった方法です(zmfに感謝)。
Criteria subcrit = criteria.createCriteria("Reports");
Disjunction dis = Restrictions.disjunction();
for (Reports r : selectedReports) {
dis.add(Restrictions.idEq(r.getID()));
}
subcrit.add(dis);
これはzmfが示唆したものとほぼ同じです。追加されたのは、渡されるコレクションから条件を構築するための分離です。
あとは、コレクションを直接使用するだけです...