可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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?
回答1:
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])
回答2:
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)
回答3:
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.
回答4:
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