1

私の古いJavaコードでは、これを実行して、休止状態のクエリで別のテーブルを「結合」し、それに基づいて結果をフィルタリングできました。

 final Criteria brokerageCriteria = userCriteria.createCriteria("brokerage");
            if (queryDto.getBrokerageID() != null) {
                brokerageCriteria.add(Restrictions.eq("id", queryDto.getBrokerageID()));
            }

この例では、特定の仲介業者のメンバーであるユーザーのみをフィルタリングします (各ユーザーは 1 つの仲介業者を持っています)。

ご覧のとおり、criteria.createCriteria(String associationName) を呼び出すことで、休止状態のマッピングに関連付けられている他のテーブルを簡単に結合できます。グレイルズでこれに似たものはありますか?内部開発者がさまざまなテーブルを検索したり、データをページングしたりできるように、汎用の JSON-to-criteria Web API を構築しようとしています。

4

1 に答える 1

2

シナリオを考慮して、ここにdomainクラスとcriteriaクエリがあります

//Domain User
class User{
    //each user has one brokerage
    static hasOne = [brokerage: Brokerage]
}

//Domain Brokerage
class Brokerage{
    //Optional
    //static belongsTo = [user: User]
}

//Criteria Query
def user = User.createCriteria().get{
    brokerage{
       idEq(queryDto.getBrokerageID())
    }
}

または非DSLの方法を使用することもできます

def user = User.createCriteria().get{
       eq('brokerage.id', queryDto.getBrokerageID())
}

criteriaDSL(ドメイン固有言語)を使用しているため、grailsの場合、関連するテーブルを簡単に結合できます。brokerage{}上記の例では、INNER JOINとして基準で関連付けを提供することによってのみ、UserおよびBrokerageに基づいて実行されbrokerageIdます。

in grailsのCriteria優れた点は、クエリを動的に処理できることです。たとえば、 aUserに 1 つと 1Brokerageつと複数の がMortgageあり、 、、のいずれかがJSON で提供されている場合にシステムからLienを取得したい場合。上記の基準は、次のように効果的に強化できます。UserbrokerageIdmortgageIdlienId

def user = User.createCriteria().get{
      if(queryDto.getBrokerageID() != null){
          brokerage{
             idEq(queryDto.getBrokerageID())
          }
      } else if(queryDto.getMortgageID() != null){
          mortgage{
             idEq(queryDto.getMortgageID())
          }
      } else if(queryDto.getLienID() != null){
          liens{
             idEq(queryDto.getLienID())
          }
      }
   }

Userドメインは次のようになります

class User{
        //each user has one brokerage and one mortgage
        static hasOne = [brokerage: Brokerage, mortgage: Mortgage]
        static hasMany = [liens: Lien] //many Liens
    }
于 2013-05-09T00:43:10.623 に答える