我有一个相当大的形式,用户可以选择任意数量的参数(从1到10)。
示例:
我应该如何在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]
}
问候,德米特里。
答案 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>标记名为ages
和cities
,并且您有一个包含字符串属性age
和city
的人员域:
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)
我建议您仅使用createCriteria
或withCriteria
让我们举一个例子:
如果行动的参数与你给出的一样:
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文档中的createCriteria
或withCriteria
。