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方言のいずれか)を使用してこれを実行したいことを忘れないでください。
これに取り組む方法についての指針はありますか?
ありがとうございました!
- ゲイリー