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

Posted

技术标签:

【中文标题】Grails findAll带有排序,顺序,最大值和偏移量?【英文标题】:Grails findAll with sort, order, max and offset? 【发布时间】:2012-11-07 04:11:39 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

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

使用 where 查询对我有用:

def books = Book.whereapproved == true.list(sort: 'dateCreated', order: 'desc', max: max, offset: offset)

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

def books = Book.whereapproved == true.list(params)

【讨论】:

【参考方案3】:

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

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

点击here了解详情。

【讨论】:

【参考方案4】:

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

如果您从控制器操作中调用它,那么您已经可以使用魔术变量“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

【讨论】:

以上是关于Grails findAll带有排序,顺序,最大值和偏移量?的主要内容,如果未能解决你的问题,请参考以下文章

在 Grails/GORM 中定义默认排序顺序

GRAILS:findALL() vs FindBy---(params.id)

更改结果 grails findAll 或响应方法

使用 Jackson 序列化带有排序键的 JSON

Sequelize如何添加自定义排序功能?

SQL 到 HQL 查询 Grails