1

这里的这个例子来自 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。

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

4

1 回答 1

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)

        }

即使没有为性别字段传回任何值,它仍然有效(因为性别标准中的 if 语句。

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

于 2013-11-08T17:14:06.503 回答