Grails findAll with sort, order, max and offset?

前端 未结 4 1504
时光取名叫无心
时光取名叫无心 2021-02-19 18:25

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 ord         


        
相关标签:
4条回答
  • 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.

    0 讨论(0)
  • 2021-02-19 18:40

    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])
    
    0 讨论(0)
  • 2021-02-19 18:43

    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)

    0 讨论(0)
  • 2021-02-19 18:46

    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
    
    0 讨论(0)
提交回复
热议问题