【问题标题】:How to order by more than one field in Grails?如何在 Grails 中按多个字段排序?
【发布时间】:2010-09-24 11:21:18
【问题描述】:

有没有办法获得按两个字段排序的列表,比如姓氏和名字?

我知道.listOrderByLastAndFirst.list(sort:'last, first') 不起作用。

【问题讨论】:

    标签: grails sql-order-by grails-orm


    【解决方案1】:

    Hates_ 标准答案似乎对我不起作用;将"last,first" 排序只会导致异常说"Property 'last,first' not found"。要对两个字段进行排序,您可以执行以下操作:

    def c = MyDomain.createCriteria()
    def results = c.list {
        and{
           order('last','desc')
           order('first','desc')
        }
    }
    

    【讨论】:

    • 这里需要'and'块吗?
    • @Matt Lachman:有趣的是,我认为标准周围有一个隐含的and。你能解释一下没有and会发生什么吗?
    • 也许我有点太仓促了。我收回我的评论:grails.1312388.n4.nabble.com/…
    • 在 Grails 2.3.7 中没有外部 and 块的情况相同
    【解决方案2】:

    这已经很老了,但帮助我找到了合适的解决方案。使用 withCriteria 快捷方式的“更干净”的代码示例:

    def c = MyDomain.withCriteria {
        and {
            order('last', 'desc')
            order('first', 'desc')
        }
    }
    

    【讨论】:

    • 到目前为止,这绝对是最干净的解决方案。我不希望我们能做得更好。
    【解决方案3】:

    这个旧的解决方案不再有效。请在下面查看 mattlary 的回答

    您可能需要在 HQL 中编写自定义查找器或使用 Criteria Builder。

    MyDomain.find("from Domain as d order by last,first desc")
    

    或者

    def c = MyDomain.createCriteria()
    def results = c.list {
           order("last,first", "desc")
    }
    

    【讨论】:

    • 不确定为什么它被标记为否定,但第一种方法 Mydomain.find 肯定有效。可能他在上面有一些错字,但这不是减号的理由。来自我的 +1。
    • 5 年前工作过;) 可惜我不能删除它。
    • 哦,我多么不喜欢人们对过去有用的东西投反对票。
    • org.hibernate.QueryException: 无法解析属性:last,first of: MyDomain at grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:1616)
    【解决方案4】:

    更复杂的排序标准,(在 Grails 2.1.0 中测试)

    def c = MyDomain.withCriteria {
        property {
            order('last', 'desc')
        }
        order('first', 'desc')
    }
    

    首先按 MyDomain.property.last 排序,然后按 MyDomain.first 排序

    【讨论】:

      【解决方案5】:

      我认为标准是最好的选择,但您首先尝试查找器是正确的。从 GORM 检索域对象时,尝试的正确顺序是:动态查找器、条件、HQL。

      【讨论】:

        【解决方案6】:

        此查询基于第一个字段。当第一个字段为空时,它会被第二个字段短接。

        order('last','desc')
        order('first','desc')
        

        【讨论】:

          【解决方案7】:

          你可以这样做

          def results=MyDomain.findAll([sort:"last",order:'desc'],[sort:"first",order:'desc']);
          

          这行代码将首先按姓氏对域类“MyDomain”的结果进行排序,然后按人的名字排序。

          【讨论】:

            【解决方案8】:
            MyDomain.findAll(sort: ['first': 'desc','last':'desc'])
            

            适用于 grails-datastore-gorm:6.0.3

            【讨论】:

            • 此解决方案适用于 Grails 4.0.3 和 GORM 7.0.4。你也可以做类似Person.findByUsername(username, [sort: ['lastName': 'asc', 'firstName': 'asc']])
            【解决方案9】:

            如果您要根据项目的内容对列表进行排序,则需要实现一个比较器,该比较器具有一些智能功能,可以让您根据多个属性确定排序顺序。

            Groovy 风格比较器的一些示例显示在here

            但是,如果您正在排序的列表是从数据库查询中返回的,您最好使用 CrteriaQuery 对其进行排序并对其进行排序

            【讨论】:

              【解决方案10】:

              我也有同样的问题。 由于我的列表不是那么大,我使用 groovy 排序,因为我想对链接域的字段进行排序: CalendarData -> 景点

              def listCalendar (Calendar calendar) {
                  respond CalendarData.where {
                      calendar == calendar
                  }.list().sort{ "$it.attraction.type?:' '$it.attraction.name" }
              }
              

              【讨论】:

                猜你喜欢
                • 2016-01-06
                • 2021-11-03
                • 2013-04-26
                • 1970-01-01
                • 2020-11-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多