Grails findAll with sort, order, max and offset?

陌路散爱 提交于 2019-12-05 19:01:46

问题


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


来源:https://stackoverflow.com/questions/13450410/grails-findall-with-sort-order-max-and-offset

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!