具有计数条件的 Hibernate 条件
Hibernate Criteria with condition on count
我需要相当于
SELECT m.id, count(i.id)
FROM master m LEFT JOIN item i on m.id = i.master_id
GROUP BY m.id, m.size
HAVING m.size <> count(i.id);
在 Hibernate 标准中。感谢 this question,我知道如何将分组结果作为 Object[]
:
的列表
ProjectionList projList = Projections.projectionList();
projList.add(Projections.groupProperty("master"));
projList.add(Projections.count("id"));
session
.createCriteria(Item.class)
.join("master")
.setProjection(projList)
.addRestriction(???) // <- my HAVING clause
.list();
我不知道如何添加 HAVING 子句。我想,它有点像 Restrictions.eqProperty
,但我如何参考计数?
有没有办法在查询中引用生成的元组元素?
Hibernate Criteria API 不支持 HAVING
子句。由于它在较新的 Hibernate 版本中已被弃用,我建议您转向 JPA Criteria API,或使用 HQL/JPQL 或更高级的包装器,如 Querydsl JPA.
您可以使用 sqlRestriction 解决方法,例如:
Restrictions.sqlRestriction("1=1 group by this_.id, this_.size HAVING this_.size <> count(i_.id));
这是一个例子:
ct.setProjection(Projections.sqlProjection(
"cobr_.client_id as clientID"
, new String[] {"clientID" }
, new Type[] { new LongType()}));
ct.add(Restrictions.sqlRestriction("1=1 group by cobr_.vlr_total,clientID having (sum(this_.vlr_net)-cobr_.vlr_total) < -20"));
我需要相当于
SELECT m.id, count(i.id)
FROM master m LEFT JOIN item i on m.id = i.master_id
GROUP BY m.id, m.size
HAVING m.size <> count(i.id);
在 Hibernate 标准中。感谢 this question,我知道如何将分组结果作为 Object[]
:
ProjectionList projList = Projections.projectionList();
projList.add(Projections.groupProperty("master"));
projList.add(Projections.count("id"));
session
.createCriteria(Item.class)
.join("master")
.setProjection(projList)
.addRestriction(???) // <- my HAVING clause
.list();
我不知道如何添加 HAVING 子句。我想,它有点像 Restrictions.eqProperty
,但我如何参考计数?
有没有办法在查询中引用生成的元组元素?
Hibernate Criteria API 不支持 HAVING
子句。由于它在较新的 Hibernate 版本中已被弃用,我建议您转向 JPA Criteria API,或使用 HQL/JPQL 或更高级的包装器,如 Querydsl JPA.
您可以使用 sqlRestriction 解决方法,例如:
Restrictions.sqlRestriction("1=1 group by this_.id, this_.size HAVING this_.size <> count(i_.id));
这是一个例子:
ct.setProjection(Projections.sqlProjection(
"cobr_.client_id as clientID"
, new String[] {"clientID" }
, new Type[] { new LongType()}));
ct.add(Restrictions.sqlRestriction("1=1 group by cobr_.vlr_total,clientID having (sum(this_.vlr_net)-cobr_.vlr_total) < -20"));