Grails findAll有sort,order,max和offset吗?

con*_*ile 9 grails groovy grails-orm

我想在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])
Run Code Online (Sandbox Code Playgroud)

但我想要的是:

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

这不起作用.我该如何重写呢?

Ian*_*rts 7

HQL不支持排序和顺序作为参数,因此您需要在"HQL表达式"中包含"order by"

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

(或者在这种情况下只使用Book.findAllByApproved(true, [...])而不是HQL).

因此,如果排序和顺序是变量,你需要一个技巧

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])
Run Code Online (Sandbox Code Playgroud)


Coo*_*ino 6

使用where查询对我有用:

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

或直接从页面使用params:

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


小智 5

使用“findAllBy”是因为它支持排序和顺序。

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

单击此处了解详细信息。