12

我想在 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])

这不起作用。我该如何重写这个?

4

4 回答 4

8

HQL 不支持 sort 和 order 作为参数,因此您需要在 HQL 表达式中包含“order by”

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])
于 2012-11-19T09:24:06.087 回答
7

使用 where 查询对我有用:

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

或者直接从页面使用参数:

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

于 2015-07-22T15:43:18.207 回答
6

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

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

点击这里了解详情。

于 2017-11-01T13:59:47.063 回答
1

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

如果您从控制器操作中调用它,那么您已经可以使用魔术变量“params”。例如,如果您请求页面如下

book/list?max=10&offset=2

那么“params”将已经自动映射了这些值。

您可以向 params 映射添加更多项目,如下所示

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

根据需要构建参数后,您可以使用 Grails 动态查询,如下所示

def books = Book.findAllByApproved(true, params)
// use "books" variable as you wish
于 2017-11-01T21:47:49.610 回答