문제

I want to integrate sort, order, max and offset in a findAll query. The following works fine:

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

But what I want is:

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

This does not work. How do I have to rewrite this?

도움이 되었습니까?

해결책

HQL doesn't support sort and order as parameters, so you need to include the "order by" as part of the HQL expression

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

(or in this case just use Book.findAllByApproved(true, [...]) instead of HQL).

So if the sort and order are variables you need a trick like

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])

다른 팁

Using a where query works for me:

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

Or with params straight from the page:

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

Using "findAllBy" because it supports sort and order.

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

Click here for details.

I am assuming you are calling fetching the list of books in a controller or a service class.

If you are calling this from a controller action, then a magic variable "params" is already available to you. For example, if you request the page as follows

book/list?max=10&offset=2

then "params" will already have those values mapped automagically.

You can add more items to the params map as follows

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

Once you have build your params as desired, then you can use Grails dynamic query as follows

def books = Book.findAllByApproved(true, params)
// use "books" variable as you wish
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top