2013-02-13 1 views
0

결과를 JSON 형식으로 반환하는 REST 서비스를 만들려고합니다.createCriteria()

검색 결과를 반환하는 메소드를 만들었습니다. 검색 매개 변수의 EnumMap을 받아들이고이를 확인하여 createCriteria를 빌드합니다.

난 데 문제는 tradingName은 유효 기간에 적용되는 validFor에 관계없이 현재 날짜/시간이 기간 여부 "에 대한 유효"에 있는지 여부의 반환됩니다 있다는 것입니다. 그것은 단지 다른 두 validFor 같이 names의 제 다시 가져와야 반환 JSON의 예에서는

findCentre 방법 startend 범위를 벗어난다

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": "[email protected]" 
} 
] 

나는이 문제가 findCentre 방법에 있다고 생각하지만 현재 Grails 경험이 부족하여 좌절의 원인이되고있다. 네가 나에게 줄 수있는 어떤 도움이라도 대단히 감사 할 것이다. 당신이 돌아

답변

1

결과는 전체 Centre 객체 - 당신은 누구의 현재 이름 패턴과 일치하는 당신의 검색을 제한, 그러나 일치하는 객체에 관계없이 날짜로 알려져있다 모든 이름을 반환하고 있습니다.

가장 쉬운 방법은

[ 
    {"code":"1", 
    "names":["ABC"], 
    "email": "[email protected]" 
    } 
] 
+0

감사 이안처럼 당신에게 JSON을 제공해야하는 직접

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

을 돌아보다 기준 결과 오히려 포스트 필터 될 가능성이 높습니다. 그 일은 훌륭했습니다. 나는 그것이'Centre' 객체 전체를 반환한다는 것을 알았지 만,'validFor {and {le ("start", new Date()) ge ("end", new Date()}} createCriteria()의 올바른 결과가 필터링되었습니다. 이것 좀 더 설명해 주시겠습니까? 죄송합니다. Grails는 완전히 새로운 것입니다. –

+1

@GarethLewis 기준 쿼리의 조건은 데이터베이스에서 선택된 개체를 제한하는 방법 일 뿐이지 만 선택한 각 개체는 SQL 용어로 전체적으로 반환되지만 WHERE 절이지만 SELECT 처리 대상에는 영향을 미치지 않습니다. 당신은'projections' 블록을 사용하여 SELECT를 정의 할 수 있습니다.하지만 여러분은 프로젝션에 필요한 것을 할 수 없었습니다. 그래서 나는 포스트 필터링을 제안했습니다. –

+0

다시 한 번 감사드립니다. 나는 네가하는 말을 얻는다. 정보만을위한 '전망'을 조사 할 것입니다. –