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)
这不起作用.我该如何重写呢?
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)
使用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)
单击此处了解详细信息。