【问题标题】:Hibernate criteria MAX of SUM休眠条件 MAX of SUM
【发布时间】:2017-09-01 14:22:04
【问题描述】:

如何使用标准 (JAVA) 实现此 HQL

"SELECT MAX(pointsum) FROM (SELECT SUM(h.point) as pointsum FROM HealthPoint h WHERE h.player.partner = :partner GROUP BY h.player)"

我已经对此进行了测试,但我得到了,但我得到了 pointsum 未找到的属性

DetachedCriteria detachedPlayer = DetachedCriteria.forClass(Player.class);
detachedPlayer.add(Restrictions.eq("partner", partner));
detachedPlayer.setProjection(Projections.property("id"));

Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(HealthPoint.class);
criteria.add(Subqueries.propertyIn("player", detachedPlayer));
ProjectionList proj = Projections.projectionList();
proj.add(Projections.sum("point"));
proj.add(Projections.groupProperty("player"));
criteria.setProjection(Projections.alias(proj, "pointsum"));
criteria.setProjection(Projections.max("pointsum"));
return (Integer) criteria.uniqueResult();

提前谢谢你!

【问题讨论】:

    标签: java hibernate hql criteria


    【解决方案1】:

    在 hql 中不支持

    from 子句中的子查询在 hql 中可能是不可能的。 见https://docs.jboss.org/hibernate/stable/core.old/reference/en/html/queryhql-subqueries.html

    请注意,HQL 子查询可能只出现在 select 或 where 条款。


    其他选项

    我有两个建议来解决这个问题:排序和限制结果,或者创建一个视图。

    1. 将结果限制为您想要的结果:

      .createQuery("SELECT SUM(h.point) as pointsum FROM HealthPoint h WHERE h.player.partner = :partner GROUP BY h.player order by pointsum desc")
      .limit(1);
      
    2. 在数据库中创建一个视图并从中选择

      create view HealthPointSumsByPlayer 
      as 
        select sum(point), player_id 
        from Health_Points 
        group by player_id;
      

    然后从中选择(通过 hql)。

    【讨论】:

    • 选项 1 解决了问题,即使我不太喜欢它,因为它不是真正的 MAX 函数,但给出相同的结果!注意:没有 .limit(..) 而是 .maxResult(..)。谢谢@Andreas!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    相关资源
    最近更新 更多