2012-11-19 33 views
6

我想在findAll查询中整合排序,顺序,最大值和偏移量。以下工作正常:Grails findAll具有排序,顺序,最大和偏移量?

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]) 

这是行不通的。我该如何重写这个?

回答

7

HQL不支持排序和顺序作为参数,所以你需要“按订单”的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]) 
+0

这不回答这个问题。如何在此查询中包含排序和顺序作为变量? – confile

+0

@userWebMobile请参阅编辑。 –

+0

你为什么要用:''? – confile

6

一招使用,其中查询工作对我来说:

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

或用直接从网页PARAMS:

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

0

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

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

点击here了解详情。

0

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

如果您是通过控制器操作调用此函数,那么魔术变量“params”已经可供您使用。 例如,如果您请求的页面如下

book/list?max=10&offset=2 

然后“PARAMS”已经具有自动地映射这些值。

您可以添加更多的项目到PARAMS图如下

params.sort = "dateCreated" 
params.order = "desc" 

一旦你建立你的PARAMS根据需要,那么你可以使用Grails的动态查询如下

def books = Book.findAllByApproved(true, params) 
// use "books" variable as you wish