Grails/Hibernateで「すべての」基準クエリを実行する方法が必要です。標準の「in」制限は、私が「inany」制限と呼ぶものです。
例として...
前文
別のドメインクラス「Perils」と多対多の関連があるドメインクラス「Knights」を取り上げます。クラスはシンプルです...
class Knight {
String name
static hasMany = [perils:Peril]
}
class Peril {
String name
static hasMany = [knights:Knight]
static belongsTo = Knight
}
テーブルの内容は次のようになります...
騎士
1英国の王、アーサー(技術的には騎士ではありません。私は知っています。私は知っています。)
2ベディヴィア・ザ・ワイズ卿
3ランスロット・ザ・ブレイブ卿
4ロビン卿は、ランスロット卿としてはかなり勇敢ではありません
5純粋なガラハッド卿
危険
1ブラックナイト
Niと言う2人の騎士
33頭の巨人
4沼城
5キャッスル炭疽菌
6カルバノグの殺し屋
Knights_Perils
1、1//アーサーはブラックナイトと戦う
1、2//アーサーはniと言う騎士と戦う
2、2//ベディヴィアはniと言う騎士と戦う
4、3//ロビンは三頭の巨人から逃げる
3、4//ランスロットアサルトスワンプキャッスル
5、5//ガラハッドが炭疽菌城を訪問
3、5//ランスロットが炭疽菌からガラハッドを「救助」
1、6//すべての騎士がキラーバニーと戦う
2、6//..。
3、6//..。
4、6//..。
5、6//..。
関連付けを検索するためのチェックボックスを提供するフォームを提示します...
危険を選択し、騎士を検索...
[]ブラックナイト(id 1)
[] Ni(id 2)と言う騎士
[]三頭巨人(id 3)
[x]スワンプキャッスル(id 4)
[x]炭疽菌(id 5)
[x]キラーバニー(id 6)
[探す]
そして、私はこのようにクエリします:
def query = Knights.createQuery()
query.list(max: params.max, offset: params.offset) {
if(params.perils) perils { 'in' ('id', params.list('perils')*.toLong()) }
}
それは私が「どんな」結果と呼ぶものを生み出します。チェックされた危険のリストの「いずれか」に関連する騎士。上記のフォームの3つのチェックされた危険の場合、すべての騎士は...
アーサー-バニーと戦う
ベディヴィア-バニーと戦う
ランスロット-沼の城、城の炭疽菌、バニーと戦う
ロビン-バニーと戦う
ガラハッド-城炭疽菌、バニーと戦う
質問
「in」に似たHibernate/Grails基準の制限を探していますが、「inall」を照会します。言い換えれば、ナイトはリスト内のチェックされた危険の「すべて」に関連付けられています。この制限と上記と同じフォーム入力を使用すると、結果は次のようになります。
ランスロット-沼の城、城の炭疽菌、バニーと戦う
Hibernate基準の「in」制限の「inall」バージョンはありますか?
SQLやHQLを直接使用するのではなく、CriteriaQuery(HibernateまたはGrails方言のいずれか)を使用してこれを実行したいことを忘れないでください。
これに取り組む方法についての指針はありますか?
ありがとうございました!
- ゲイリー