2010-05-16 49 views
1

我在使用Grails中的Hibernate Criteria查询时遇到了一个问题。Hibernate标准中的协调规模

请看:

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个

标准应该返回该客户端,并且如果

  • params.from = 3

不会返回;
但它返回,因为尺寸锗正在应用于所有访问,无论它具有哪个日期。

// END UPD。

让我知道如果smth仍然不清楚。

任何帮助表示赞赏。

谢谢,Vova。

+0

您能详细说明吗? – 2010-05-16 20:00:36

回答

1

你需要一个条款来做到这一点,我发现在issue open in Hibernate's Jira增加支持。

同时您应该使用HQL并手动编写查询,see this。如果您不需要根据某些选定的字段更改查询的限制,您应该始终使用HQL,它可以被缓存。

0

谢谢菲利普。

此外,我选择使用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。