Hibernate标准中的关联大小

时间:2010-05-16 14:07:52

标签: hibernate grails associations criteria fetch

我在Grails中使用Hibernate Criteria查询时遇到了问题。

看看:

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: sizeGe sizeLe 限制的工作并不像我预期的那样。

从我的观点来看,它们应该在 限制之后应用,但不是。

例如:

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')
  • params.from = 2

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

  • params.from = 3

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

// END UPD。

如果smth还不清楚,请告诉我。

感谢任何帮助。

谢谢,Vova。

2 个答案:

答案 0 :(得分:1)

你需要一个having子句才能做到这一点,我在issue open in Hibernate's Jira找到了为此添加支持。

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

答案 1 :(得分: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。