【问题标题】:Hibernate Criteria with condition on count具有计数条件的休眠条件
【发布时间】:2017-12-25 04:01:33
【问题描述】:

我需要相当于

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);

在休眠标准中。感谢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 之类的东西,但是我怎么能引用计数呢?

有没有办法在查询中引用结果元组元素?

【问题讨论】:

  • m.size 怎么能在你的having子句中而不在group by子句中?
  • @jpprade 这是 MySQL。 :D MySQL 在这方面相当草率,我忘了打开严格模式。另一件事是 id 是 PK,在 GROUP BY 中提及 size 是多余的(从逻辑上讲,不是根据 SQL)。

标签: java hibernate hibernate-criteria


【解决方案1】:

Hibernate Criteria API 不支持HAVING 子句。由于它在较新的 Hibernate 版本中已被弃用,我建议您转移到 JPA Criteria API,或使用 HQL/JPQL 或更高级的包装器,如 Querydsl JPA

【讨论】:

    【解决方案2】:

    您可以使用 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"));
    

    【讨论】:

    • 这是为了更大的利益而进行的 SQL 注入。 :D 丑得要命,但是 +1。
    猜你喜欢
    • 1970-01-01
    • 2014-02-04
    • 2016-10-04
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 2011-07-14
    • 2014-06-24
    • 1970-01-01
    相关资源
    最近更新 更多