【问题标题】:Sorting on multiple fields with criteria in Grails在 Grails 中使用条件对多个字段进行排序
【发布时间】:2009-08-20 04:41:07
【问题描述】:

我有以下查询,其中 id 喜欢按“raceDate”和“raceNo”asc 排序。我可以弄清楚如何按一个字段排序,但不能按两个字段排序,有什么想法吗?

def list = {
        params.max = Math.min( params.max ? params.max.toInteger() : 20,  100) 
        params.offset = params?.offset?.toInteger() ?: 0
        params.sort = "raceDate"
        params.order = params?.order ?: "asc"

        def results = Race.createCriteria().list(
                max: params.max,
                offset: params.offset,
                sort: params.sort, 
                order: params.order
                ) {
            and {
                if (params.raceNo && params.raceNo != '')
                    eq("raceNo", params.raceNo.toInteger())
                if (params.country && params.country != '')
                    eq("country", params.country)
                if (params.venue && params.venue != '')
                    eq("venue", params.venue)
                if (params.raceType && params.raceType != '')
                    eq("raceType", params.raceType)
                if (params.surface && params.surface != '')
                    eq("surface", params.surface)
                if (params.officialGoing && params.officialGoing != '')
                    eq("officialGoing", params.officialGoing)

                if (params.raceDateStart_year && params.raceDateStart_month && params.raceDateStart_day 
                        && params.raceDateEnd_year && params.raceDateEnd_month && params.raceDateEnd_day) {
                    String startInput = "${params.raceDateStart_year}/${params.raceDateStart_month}/${params.raceDateStart_day}"
                    Date startDate = jodaFormatter.parseDateTime(startInput).toDate();
                    String endInput = "${params.raceDateEnd_year}/${params.raceDateEnd_month}/${params.raceDateEnd_day}"
                    Date endDate = jodaFormatter.parseDateTime(endInput).toDate();  

                    between("raceDate", startDate, endDate)
                }
            }
        }

        [ raceInstanceList:results, raceInstanceTotal:results.totalCount, params:params ]
}

【问题讨论】:

  • 我认为你的例子可以减少一点。 class Foo { String name int age } 那么请问,如何使用 GORM 条件先按姓名排序,再按年龄排序?
  • [已在此回答][1] [1]:stackoverflow.com/questions/326053/…

标签: hibernate grails groovy controller criteria


【解决方案1】:

这样的事情应该可以工作:

def results = Race.createCriteria().list(
                max: params.max,
                offset: params.offset,
                sort: params.sort, 
                ) {
                order('raceDate', 'asc')
                order('raceNo', 'asc')
                and {
                    if (params.raceNo && params.raceNo != '')
                        eq("raceNo", params.raceNo.toInteger())
                ...

【讨论】:

  • 这不起作用,并抛出错误:列“table.RaceNo”在 ORDER BY 子句中无效,因为它不包含在聚合函数或 GROUP BY 子句中。
猜你喜欢
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 2011-05-23
  • 2017-05-18
  • 2012-11-02
相关资源
最近更新 更多