2010-05-16 3 views
1

Grails에서 최대 절전 모드로 쿼리 할 때 문제가 발생했습니다.최대 절전 모드 기준의 어소시에이션 크기

def visitors = Client.withCriteria{ 
      visits{ 
      use (TimeCategory) {between('date',date,date+1.month-1)} 
      } 
      sizeGe("visits",params.from) 
      sizeLe("visits",params.to) 
      fetchMode("visits", FM.JOIN) 
}; 

내가에서 사이의 달에 방문수와 에 경계를 가지고있는 클라이언트 만이 필요합니다

가보세요.

하지만 이제 크기 * 모든 방문에 제한이 적용됩니다. 따라서 고객이이 달에 한 번 방문하고 지난 달에 방문하는 경우 = 2으로 설정하면이 클라이언트가 생성됩니다. 하지만 거기에 있지 않아야합니다.

// UPD : 나는 예상대로 그 sizeGesizeLe 제한 같은 것은하지 작동합니다.

내 관점에서 사이에 적용해야하지만 제한 사이에 적용해야합니다. 예를 들어

:

def client = new Client(); 

client.visits.add(new Visit(date:'2010-03-16')); 
client.visits.add(new Visit(date:'2010-05-16')); 
client.visits.add(new Visit(date:'2010-05-17')); 
client.save(); 

그리고 내가 원하는 경우 :

  • 날짜 = 다음 Date.parse ('YYYY-MM', '2010-05')
  • params.from = 2 개

기준이 클라이언트를 반환해야하고

,691 경우 363,210
  • params.from = 3

하지 리턴;
크기모든 방문에 적용 되었기 때문에 반환합니다. 날짜는 관계 없습니다.

// end UPD.

아직 명확하지 않은 경우 알려주십시오.

도움을 주시면 감사하겠습니다.

감사합니다. Vova.

+0

더 자세히 설명해 주시겠습니까? –

답변

1

이렇게하려면 having 절이 필요하고 이에 대한 지원을 추가하려면 issue open in Hibernate's Jira에 있습니다.

한편 HQL을 사용하고 수동으로 쿼리를 작성해야합니다 (see this). 선택된 필드에 따라 쿼리의 제한을 변경할 필요가 없다면 항상 HQL과 함께 가야합니다. 캐시 될 수 있습니다.

0

감사합니다. Felipe.

또한 sqlRestriction을 사용하도록 선택했습니다.물론 이식성 문제는 있지만 작동합니다.

def visitors = c.listDistinct{ 
     use(TimeCategory){ 
       visits{ 

        between('date',date,date+1.month-1) 
       } 

       sqlRestriction(
         """(
          select count(*) 
            from visit v 
          where 
           v.visitor_id={alias}.id 
           and v.date between 
             '${date.format("yyyy-MM-dd")}' 
             and '${(date+1.month-1).format("yyyy-MM-dd")}' 
          ) 
          between ${params.from} and ${params.to}""" 
       ) 
      } 
    } 

감사합니다. Vova.