Hibernate标准中的关联大小
在Grails中使用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
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:
像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')
- 参数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}"""
)
}
}
谢谢,沃瓦