2013-05-24 7 views

答えて

7

それは私だけのGrails documで出会ったものを追加する価値がありますcreateCriteria()のために。

そのクエリは、ページネーションパラメータ(maxおよびオフセット)を備え、これは、ページネーションのレコードを一致の合計数を返すgetTotalCount()メソッドを有するPagedResultListが返されるので。 2つのクエリは引き続き実行されますが、それらはあなたのために実行され、結果と合計カウントはPagedResultListに結合されます。

Source

これは、あなたが(それはあなたのために作られている)の呼び出しを開始することなく、getTotalCount()を使用できることを意味します。これは非常に役に立ちます。例のマニュアルには示しています

def c = Account.createCriteria() 
def results = c.list (max: 10, offset: 10) { 
    like("holderFirstName", "Fred%") 
    and { 
     between("balance", 500, 1000) 
     eq("branch", "London") 
    } 
    order("holderLastName", "desc") 
} 
println "Rendering ${results.size()} Accounts of ${results.totalCount}" 

この機能は利用可能withCriteria()を使用していません。

+0

上記のBETWEEN句を使用してfrom/to dateのクエリを書く方法を教えてください。 – VVB

+0

@VVBあなたの質問は、コメントとしてここに含めるのではなく、新しいstackoverflow質問として、より適しています。 – mnd

4

withCriteriaは、リストを実行して返します。これは、実行前に条件をカスタマイズできるクロージャを提供します。

createCriteriaは、変更可能な基準オブジェクトを作成するだけで、実行するリストメソッドを明示的に呼び出すことができます。

基準が単純な場合、または単一の場所で定義されている場合は、withCriteriaを使用する方がよいでしょう。

基準を渡す必要がある場合(ある関数で作成して他の関数に渡す必要がある場合)、createCriteriaが適切です。私はwithCriteriaのサポートは限られていると思います。

+0

あなたが例を与えることができますしてください? – danielad

7

withCriteria { ... }は、実質的にcreateCriteria().list { ... }の略です。他の基準メソッド(get、count、...)を使用するか、ページ分割パラメータをlistに渡す必要がある場合は、long-handフォームを使用する必要があります。

SomeDomain.createCriteria().list(max:10, offset:50) { 
    // ... 
} 
+0

短い手? – danielad

+0

BETWEEN句を使用してfrom/to dateのクエリを書く方法を教えてください。 – VVB

+0

@VVB http://grails.github.io/grails-doc/latest/ref/Domain%20Classes/createCriteria.htmlの情報から作業できない場合は、次のように質問してください。それは実際にこの質問の主題に関連していないので、それ自身の権利である。 –

5

createCriteria()の例:

def criteria = OfferCredit.createCriteria { 
    offer { 
     eq('status', LeverageUtils.ACTIVE_STATUS) 
     ge('expirationDate', new Date()) 
    } 
    user { 
     eq('userId', userId) 
    } 
    eq('status', LeverageUtils.ACTIVE_STATUS) 
    order('creationDate', 'asc') 
} 

criteria.list() 

withCriteria()の例:

List<Supermarket> results = Supermarket.withCriteria { 
    like("sp_street", params.street) 
    productSupermarket { 
     product { 
      idEq(params.product) 
     } 
     // or just eq('product', someProduct) 
    } 
    maxResults(10) 
} 
+2

あなたが与えた事例に感謝します。 createCriteraは、ドメインオブジェクトとwithCriteria -applyクエリパラメータを最初に見つけて、次にdominオブジェクトの検索を行った後で、criteriaパラメータを適用するようです。ではない? – danielad

+1

はい! createCriteriaを使用すると、listなどの複数の操作を実行できます。しかし、 'withCriteria'を使用すると、デフォルトの操作はlistになります。 (他の操作はできません)。 –

2

withCriteria - >

目的 - > Criteriaクエリのインライン実行を許可します。 一致するレコードが見つからない場合は、空のListが返されます。

投影が指定されている場合:

returns a single value if it only contains one field 
a List in case there are multiple fields in the projection 
関連する問題