2017-12-06 9 views
2

私は、データベースのテーブルに対して、次の例を作成するドメイン定義があります。テーブルBに存在しないテーブルAの行を、inListクロージャを使用せずにGORMで取得する方法はありますか?

Table example

私は次のクエリを実行したい:には存在しない表Aに関連するすべてのドメインオブジェクトを取得表B

私は次のようにinListクロージャを使用していました:

List<DMiembro> m = DMiembro.list() 

    List<DUsuario> usuarios = DUsuario.createCriteria().list(params) { 
     if (m) { 
      not { 
       m*.usuario.id.collate(1000).each { def lista -> 
        or { 
         inList("id", lista) 
        } 
       } 
      } 
     } 
     eq("enabled", true) 
     order("nombre", "asc") 
    } as List<DUsuario> 

これは問題なく動作します。しかし、DMiembroのデータは大きくなっています。今私は、クエリのサイズに関連するデータベースエラーを取得しています。クエリのパラメータ数が大きすぎるため論理的です

したがって、DMiembroに存在しないオブジェクトDusuarioを収集するためのクエリを作成する別の方法はありますか?

+0

私はtableB.idがNULLのどこの制約で右結合を使用できるはずだと思います。 – elixir

+0

JoinType.RIGHT_OUTER_JOINを使用しようとしました。ただし、Oracle 12cを使用しており、その構文は許可されていません。私は、Oracle 9iとOracle 10gのdiaclectの使用をsuggetingメッセージを得た –

答えて

1

解決策1: 条件にGORM DetachedCriteriaを使用できます。

import grails.gorm.DetachedCriteria 
List<DUsuario> usuarios = DUsuario.createCriteria().list(params) { 
     not { 
      'in'('id', new DetachedCriteria(DMiembro).build { 
       projections { 
        property 'id' 
       } 
      }) 
     } 
     eq("enabled", true) 
     order("nombre", "asc") 
} as List<DUsuario> 

あなたが見ることができるように、これはパフォーマンスのために良いアイデアではありません SQL要求、、IN れません。しかし、リクエストはもっと理解できるものであり、ボリューメトリ(リクエストの実行時間を除く)に関係なく、まだまだ良い解決策です。

解決方法2:LEFT JOINまたはRIGHT JOINとオペレータとDMiembroテーブル上NULLチェックしていないを避けてください。プレーンSQLとしての左結合を持つソリューションについては、hereを参照してください。

+0

私は2番目のオプションを実装しています。私の場合、Dmiembroは別のテーブルに従って増加します。 –

関連する問題