3

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方言のいずれか)を使用してこれを実行したいことを忘れないでください。

これに取り組む方法についての指針はありますか?

ありがとうございました!

  • ゲイリー
4

1 に答える 1

1

良い質問。私はSQL/HQLのすべての側面を知っているわけではないので、より良いオプションがあるかもしれませんが、次の節があります:

all the selected perils are in the knight's perils

このように表現することもできます

there is no peril in the selected perils that is not in the knight's perils

したがって、HQL では、次のように表現できます。

select knight from Knight knight
where not exists (select peril.id from Peril peril 
                  where peril.id in :selectedPerilIds
                  and peril.id not in (select peril2.id from Peril peril2
                                       where peril2.knight.id = knight.id))
于 2012-05-04T07:30:52.783 に答える