Hibernate标准中的关联大小

Hibernate标准中的关联大小,hibernate,grails,associations,criteria,fetch,Hibernate,Grails,Associations,Criteria,Fetch,在Grails中使用Hibernate条件进行查询时,我遇到了一个问题 看一看: def visitors = Client.withCriteria{ visits{ use ( TimeCategory ) {between('date',date,date+1.month-1)} } sizeGe("visits",params.from) sizeLe("visits",params

在Grails中使用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)
};
我只需要那些月访问次数在之间的客户

但是现在,大小*限制适用于所有访问。所以,如果客户在这个月有一次访问,并且在上个月访问。如果我将设置为from=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=date.parse('yyyy-MM','2010-05')
  • 参数from=2
条件应返回此客户端,如果

  • 参数from=3
不归
但是它会返回,因为sizeGe将应用于所有的访问,无论它是在哪个日期

//结束

如果smth仍然不清楚,请告诉我

感谢您的帮助


谢谢你,Vova。

你需要一个having子句来完成这项工作,我在上找到了对它的支持


同时,您应该使用HQL并手工编写查询。如果您不需要更改基于某些选定字段的查询限制,那么我应该始终使用HQL,它可以被缓存。

您需要一个having子句来执行此操作,我在上找到了添加对该操作的支持

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

谢谢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}"""
                )
            }
    }
谢谢,沃瓦。

谢谢菲利佩

另外,我选择使用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}"""
                )
            }
    }
谢谢,沃瓦