【问题标题】:Grails findAll with sort, order, max and offset?Grails findAll带有排序,顺序,最大值和偏移量?
【发布时间】: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])

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

【问题讨论】:

    标签: grails groovy grails-orm


    【解决方案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.where{approved == true}.list(sort: 'dateCreated', order: 'desc', max: max, offset: offset)

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

    def books = Book.where{approved == 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-06-02
          • 2023-03-04
          • 1970-01-01
          • 2016-07-15
          • 2018-02-26
          • 2018-08-18
          • 1970-01-01
          相关资源
          最近更新 更多