【问题标题】:Hibernate Criteria API: how to get the sum of all the values along two columnsHibernate Criteria API:如何获取两列中所有值的总和
【发布时间】:2015-04-27 10:38:04
【问题描述】:

这个问题很简单,但我无法得到一些工作。 说,我有下表

|....X....|.....A.....|.....B....|
|...........|.....3.....|.....2.....|
|...........|.....1.....|.....4.....|
|...........|.....1.....|.....2.....|

我只需要获得 A 列和 B 列中值的总和,因此 (3 + 1 + 1) + (2 + 4 + 2) = 13,我希望它与 Criteria API 一起使用。

我尝试创建一个 Projection 对沿 A 的值和一个 DetachedCriteria 进行求和,并使用类似的 Projection 对沿 B 的值求和,但我无法从 DetachedCriteria 获得唯一结果,因为它没有公开这个方法。

有什么建议吗?

【问题讨论】:

    标签: java hibernate criteria projection


    【解决方案1】:

    你可以用sqlProjection做到这一点

    .setProjection(Projections.sqlProjection("sum(A + B) as sumAB", new String[] {"sumAB"} , new Type[] {Hibernate.DOUBLE}));
    

    【讨论】:

    • 虽然表面上解决了他的问题,但这个分析器完全是他不想想做的事情
    • 根据你的结论,这完全是不是他想要做的?
    • I'd like to have it with Criteria API.
    • 是的,Hibernate 标准,如前所述。您会看到 OP 提到他尝试使用DetachedCriteria。这是 Hibernate Criteria API 的一部分,而不是 JPA Criteria API。
    • 我尝试了您的建议添加行 return (Long)criteria.uniqueResult(); 因为我的方法返回总和但 uniqueResult() 方法返回惊人的 null
    【解决方案2】:

    https://stackoverflow.com/a/21650037/351861

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Number> q = cb.createQuery(MyEntity.class);
    Root<MyEntity> t = q.from(MyEntity.class);    
    
    Path<Number> fieldB = t.get(MyEntity_.B);
    Path<Number> fieldA = t.get(MyEntity_.A); 
    Expression<Number> sum = cb.sum(fieldA, fieldB);
    q.select(sum.alias("SUM"));
    
    System.out.println(em.createQuery(q).getSingleResult());
    

    【讨论】:

    • JPA 是一个standard - 其中有一个像官方的reference implementation,hibernate 是一个alternative implementation 并且由于它与standard 兼容,两者都可以互换,甚至可能同时工作
    • @specializt 这是真的。但是,很多人直接使用 Hibernate,而不是通过 JPA。
    • 你有任何来源证明这个极其大胆的主张吗?顺便说一句:“不通过 JPA”没有任何意义 - Hibernate 标准 is JPA
    • @specializt 只需浏览 SO hibernate/jpa 标签并亲自查看。 Hibernate 是一个 JPA 实现,您可以直接使用它而不是通过 JPA 接口。因此,您使用 Hibernate Session 而不是 EntityManager
    • 不,这意味着我不会为了证明即使我给你十几个链接你也不会接受的点来寻找参考资料。另一个不,我不是hibernate的忠实粉丝,我更喜欢适用的JPA。但是对于很多客户和项目来说,JPA 只是他们不需要的开销。
    猜你喜欢
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多