我在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();
然后我想要:
标准应该返回此客户端,如果
不返回;
但它返回,因为 sizeGe 正在应用于所有次访问,无论它具有哪个日期。
// END UPD。
如果smth还不清楚,请告诉我。
感谢任何帮助。
谢谢,Vova。
答案 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。