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

时间:2012-11-19 08:56:33

标签: 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: 'dateCreated', order: 'desc', max: max, offset: offset])

这不起作用。我该怎么重写呢?

4 个答案:

答案 0 :(得分: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])

(或者在这种情况下只使用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])

答案 1 :(得分: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)

答案 2 :(得分:1)

使用" findAllBy"因为它支持排序和订单。

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

点击here了解详情。

答案 3 :(得分: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