此示例来自grails docs:
def emeaCriteria = {
eq "region", "EMEA"
}
def results = Airport.withCriteria {
emeaCriteria.delegate = delegate
emeaCriteria()
flights {
like "number", "BA%"
}
}
我的网页传回一个种族复选框组,返回行ID。那么服务器得到的是:
ethnicity:[1, 4]
或者如果用户只挑选一个种族:
ethnicity:4
def criteria = { params ->
//handle case where only one ethnicity is returned as just a string, not a list of strings
def list = params.ethnicty instanceof String ? [params.ethnicty] : params.ethnicity
if (list) {
inList('ethnicity', list)
}
}
我收到错误:java.lang.String无法强制转换为java.lang.Enum。
如果我没有列表,我想我可以搞清楚。 params正在发回字符串值,需要将它们转换为枚举类。但是在闭包中,你如何将每个条目转换为枚举列表?
答案 0 :(得分:1)
我通过多个网站帖子的组合以及上面的dmahapatro的帮助来解决这个问题。
def genderCriteria = {
if (params.gender) {
inList('gender', params.list('gender').collect { Gender.valueOf(it)} )
}
}
如果网页传回一个或多个枚举(单个字符串或字符串列表)并且您希望条件检查传回的列表中的值,则必须提供枚举类型列表(不是字符串或整数)
这是我的枚举类供参考:
public enum Gender {
M('Male'),
F('Female'),
U('Unknown')
final String value
Gender(String value) {
this.value = value
}
public String toString() {
value
}
public String getKey() {
name()
}
public String getValue() {
value
}
}
我的标准构建者:
def c = MyDomain.createCriteria()
results = c.list {
genderCriteria.delegate = delegate
genderCriteria(params)
}
即使没有为性别字段传回任何值,它仍然有效(因为genderCriteria中的if语句。
它可能不是最好或最干净的解决方案,但确实有效。