grails通过许多参数查找对象

时间:2011-03-04 20:21:23

标签: hibernate grails gorm

我有一个相当大的形式,用户可以选择任意数量的参数(从1到10)。

示例:

  1. 城市 - 纽约市,洛杉矶;年龄 - 18岁
  2. 城市 - null(没有选择);年龄 - 23,57
  3. 我应该如何在GORM级别实现find方法(错误的方法 - 组成查询字符串的方法,如果不是null则添加params等)?

    然后我应该在我的数据库中搜索适当的对象。另一个限制 - 应该使用executeQuery

    ** [EDITED]的 的的 ** * 我记得我没有发表自己的答案。那是:

        def resultList = Organization.createCriteria().list(max: params.max, offset: params.offset) {
            and {
                if (params.chosenNomenc != null) {
                    nomenclatures {
                        ilike("title", params.chosenNomenc)//for string
                    }
                }
                if (params.chosenCountries != null) {
                    countries {
                        'in'("title", params.chosenCountries)//for list
                    }
                }              
                cache true
                order("id", "asc")
            }
        }
        println("resultList:" + resultList)
        [organizationList: resultList, total: resultList.totalCount, params: params]
    }
    

    问候,德米特里。

4 个答案:

答案 0 :(得分:4)

在控制器中使用Criteria是最好的方法。

    def locProps = Location.metaClass.properties*.name
    def locs = Location.withCriteria {
        and {
            params.each { field, value ->
                if (locProps.grep(field) && value) {

                    // more checks here

答案 1 :(得分:1)

使用Criteria API,在它的闭包中你可以使用条件语句(if / else)根据params的存在来构建它。

答案 2 :(得分:-1)

假设您的< select>标记名为agescities,并且您有一个包含字符串属性agecity的人员域:

Person.withCriteria {
  if (params.list('ages')) { // inList('fieldName', null) causes an error
    inList 'age', params.list('ages')
  }
  if (params.list('cities')) {
    inList 'city', params.list('cities')
  }
}

答案 3 :(得分:-1)

我建议您仅使用createCriteriawithCriteria 让我们举一个例子:
如果行动的参数与你给出的一样:
1)城市 - 纽约市,洛杉矶;年龄 - 18岁 2)城市 - 无效(没有选择);年龄 - 23,57

假设您的域类为User,那么:

def result = User.withCriteria (max: params.max){
   if (params.Cities)
        eq('city', params.Cities)
   if (params.age)
        eq('age', params.age)
}

它将返回域类User的匹配对象列表 有关详细信息,请参阅Grails文档中的createCriteriawithCriteria