Grails 组合参数数组中的条件

Grails 组合参数数组中的条件,grails,gorm,Grails,Gorm,这里的示例来自grails文档: def emeaCriteria = { eq "region", "EMEA" } def results = Airport.withCriteria { emeaCriteria.delegate = delegate emeaCriteria() flights { like "number", "BA%" } } 我的网页正在传回一组种族复选框,返回行ID。因此,服务器得到的是: ethnici

这里的示例来自grails文档:

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


如果我没有一份清单,我想我可以弄清楚。参数正在发回字符串值,它们需要转换为枚举类。但是在闭包中,如何将每个条目转换为一个列表到枚举中呢?

我通过多个网站帖子的组合以及上面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语句)


这可能不是最好或最干净的解决方案,但它确实有效。

我通过多个网站帖子的组合,并在上面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语句)


它可能不是最好或最干净的解决方案,但确实有效。

考虑使用
params.list(“种族”)
始终获取一个列表(即使用户只选择一个种族,您也会得到
[4]
而不是
4
)这解决了字符串与列表的问题,但我仍然有把字符串转换成枚举的问题。我得到的错误是java. Lang.CasasStExcExc:JavaLang.String不能被转换成java.郎.EnUM。从浏览器传递的列表是字符串,但是“种族”是枚举。考虑使用<代码> PARAMS。始终获取列表(即使用户只选择一个种族,您也会获得
[4]
而不是
4
)。这解决了字符串与列表的问题,但我仍然存在将字符串转换为枚举的问题。我得到的错误是java.lang.ClassCastException:java.lang.string不能转换为java.lang.Enum。从浏览器传递的列表是字符串,但“种族”是枚举。