1

この例は、grails ドキュメントからのものです。

def emeaCriteria = {
    eq "region", "EMEA"
}
def results = Airport.withCriteria {
    emeaCriteria.delegate = delegate
    emeaCriteria()
    flights {
        like "number", "BA%"
    }
}

私の Web ページは、民族のチェックボックス グループを返し、行 ID を返します。したがって、サーバーが取得するものは次のとおりです。

ethnicity:[1, 4]

または、ユーザーが 1 つの民族のみを選択した場合:

   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)} )
    }
}

Web ページが 1 つまたは複数の列挙型 (単一の文字列または文字列のリスト) を返し、返されたリストから値をチェックする条件が必要な場合は、列挙型のリスト (文字列や int ではありません) を提供する必要があります。

参照用の列挙型クラスは次のとおりです。

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.

これは最善または最もクリーンなソリューションではないかもしれませんが、機能します。

于 2013-11-08T17:14:06.503 に答える