web-dev-qa-db-ja.com

Grails findAllには、並べ替え、順序、最大、オフセットがありますか?

FindAllクエリにsort、order、max、offsetを統合したいと思います。以下は正常に機能します。

def books = Book.findAll("from Book as b where b.approved=true order by b.dateCreated  desc", [max: max, offset: offset])

しかし、私が欲しいのは:

def books = Book.findAll("from Book as b where b.approved=true", [sort: 'dateCreated', order: 'desc', max: max, offset: offset])

これは動作しません。これをどのように書き直す必要がありますか?

11
confile

HQLはパラメーターとして並べ替えと順序付けをサポートしていないため、HQL式の一部として「orderby」を含める必要があります。

_def books = Book.findAll("from Book as b where b.approved=true"
  + " order by b.dateCreated desc", [max: max, offset: offset])
_

(またはこの場合、HQLの代わりにBook.findAllByApproved(true, [...])を使用してください)。

したがって、並べ替えと順序が変数の場合は、次のようなトリックが必要です。

_def books = Book.findAll("from Book as b where b.approved=true"
  + (params.sort ? " order by b.${params.sort} ${params.order}" : ''), 
  [max: max, offset: offset])
_
7
Ian Roberts

Whereクエリを使用すると次のようになります。

def books = Book.where{approved == true}.list(sort: 'dateCreated', order: 'desc', max: max, offset: offset)

または、ページから直接パラメータを使用します。

def books = Book.where{approved == true}.list(params)

6
Cookalino

並べ替えと順序をサポートしているため、「findAllBy」を使用します。

def results = Book.findAllByTitle("The Shining",
             [max: 10, sort: "title", order: "desc", offset: 100])

詳細については、 ここ をクリックしてください。

2
Rita Yuan

コントローラーまたはサービスクラスで本のリストをフェッチするように呼び出していると想定しています。

これをコントローラーアクションから呼び出す場合は、魔法の変数「params」がすでに使用可能です。たとえば、次のようにページをリクエストした場合

book/list?max=10&offset=2

その場合、「params」にはすでにそれらの値が自動的にマップされます。

次のように、パラメータマップにアイテムを追加できます。

params.sort = "dateCreated"
params.order = "desc"

必要に応じてパラメーターを作成したら、次のようにGrails動的クエリを使用できます。

def books = Book.findAllByApproved(true, params)
// use "books" variable as you wish
0
elixir