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带有排序,顺序,最大值和偏移量?的主要内容,如果未能解决你的问题,请参考以下文章