0

JSON形式で結果を返すRESTサービスを作成しようとしています。

検索結果を返すメソッドを作成しました。検索パラメータのEnumMapを受け入れ、これらをチェックしてcreateCriteriaを構築します。

私が抱えている問題はvalidFor、aが有効な期間に適用されるがtradingName、現在の日付/時刻が「有効な」期間にあるかどうかに関係なく返されるということです。

names返されたJSONの例では、他の2つvalidForが範囲外であるため、最初のJSONのみを戻す必要がstartあります。end

findCentreメソッド

def findCentre(EnumMap searchParams) {

    def c = Centre.createCriteria()
    def results = c.listDistinct {
        if(searchParams.containsKey(CENTRE_SEARCH_PARAMETERS.START_CENTRE_CODE_RANGE) && searchParams.containsKey(CENTRE_SEARCH_PARAMETERS.END_CENTRE_CODE_RANGE)) {
            between("code", searchParams.get(CENTRE_SEARCH_PARAMETERS.START_CENTRE_CODE_RANGE), searchParams.get(CENTRE_SEARCH_PARAMETERS.END_CENTRE_CODE_RANGE))
        }

        if(searchParams.containsKey(CENTRE_SEARCH_PARAMETERS.CENTRE_CODE_PARTIAL)) {
            like("code", "%" + searchParams.get(CENTRE_SEARCH_PARAMETERS.CENTRE_CODE_PARTIAL) + "%")
        }

        if(searchParams.containsKey(CENTRE_SEARCH_PARAMETERS.INDIVIDUAL_CENTRE_CODE)) {
            eq("code", searchParams.get(CENTRE_SEARCH_PARAMETERS.INDIVIDUAL_CENTRE_CODE))
        }

        if(searchParams.containsKey(CENTRE_SEARCH_PARAMETERS.CENTRE_NAME_PARTIAL)) {
            names {
                ilike("tradingName", "%" + searchParams.get(CENTRE_SEARCH_PARAMETERS.CENTRE_NAME_PARTIAL) + "%")
                validFor {
                    and {
                        le("start", new Date())
                        ge("end", new Date())
                    }
                }
            }
        }
    }
    results
}

返されるJSON応答は次のようになります

[
{
    "code": "1",
    "names": [
        {
            "trading_name": "ABC",
            "valid_time": {
                "start": "2013-02-13T08:54:31Z",
                "end": "2018-02-12T08:54:31Z"
            }
        },
        {
            "trading_name": "ABCDEF",
            "valid_time": {
                "start": "2013-03-31T23:00:00Z",
                "end": "2013-12-31T00:00:00Z"
            }
        },
        {
            "trading_name": "DEF",
            "valid_time": {
                "start": "2013-03-31T23:00:00Z",
                "end": "2013-12-31T00:00:00Z"
            }
        }
    ],
    "email": "blah@blah.com"
}
]

問題は方法にあると思いますfindCentreが、現在のGrailsの経験不足が、私を挫折させています。あなたが私に与えることができるどんな助けでも大いに感謝されるでしょう。

4

1 に答える 1

1

返される結果は完全なオブジェクトです。現在の名前がパターンに一致Centreするものに検索を制限していますが、一致するオブジェクトが日付に関係なく知られているすべての名前を返します。

最も簡単な方法は、条件の結果を直接返すのではなく、後処理することです。

Date now = new Date()
return results.collect { res ->
  [code: res.code,
   names: res.names.findAll { it.start <= now && it.end >= now }*.tradingName,
   email: res.email ]
}

JSONのようなものが得られるはずです

[
  {"code":"1",
   "names":["ABC"],
   "email": "blah@blah.com"
  }
]
于 2013-02-13T16:47:02.173 に答える