Grails findAll带有排序、顺序、最大值和偏移量?

Grails findAll带有排序、顺序、最大值和偏移量?,grails,groovy,gorm,Grails,Groovy,Gorm,我想在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]) 但我想要的是: def books = Book.findAll("from Book as b where b.approved=true", [sort: 'd

我想在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])
但我想要的是:

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

这是行不通的。我必须如何重写它?

HQL不支持将sort和order作为参数,因此需要将“order by”作为HQL表达式的一部分

def books = Book.findAll("from Book as b where b.approved=true"
  + " order by b.dateCreated desc", [max: max, offset: offset])
(或者在本例中,只需使用
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])

使用适用于我的where查询:

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

或者直接使用页面上的参数:

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

使用“findAllBy”,因为它支持排序和排序

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

单击查看详细信息。

我假设您正在调用获取控制器或服务类中的书籍列表

如果您是从控制器操作调用此函数,那么您已经可以使用一个神奇的变量“params”。 例如,如果您请求如下页面

book/list?max=10&offset=2
params.sort = "dateCreated"
params.order = "desc"
def books = Book.findAllByApproved(true, params)
// use "books" variable as you wish
那么“params”已经自动映射了这些值

您可以按如下方式向参数映射添加更多项

book/list?max=10&offset=2
params.sort = "dateCreated"
params.order = "desc"
def books = Book.findAllByApproved(true, params)
// use "books" variable as you wish
一旦您根据需要构建了参数,那么您就可以使用Grails动态查询,如下所示

book/list?max=10&offset=2
params.sort = "dateCreated"
params.order = "desc"
def books = Book.findAllByApproved(true, params)
// use "books" variable as you wish

这并不能回答问题。如何将sort和order作为变量包含在此查询中?@userWebMobile这是一个“三元条件”-
(condition?valueIfTrue:valueIfFalse)
-以处理
参数.sort
可能未设置的可能性,在这种情况下,您根本不需要
order by
子句。如果您知道您总是会有一些排序和顺序值,那么只需无条件地使用
位“order by b.${params.sort}${params.order}”。