Hi there,
Is it possible to perform a query like SELECT SUM(x) FROM (SELECT MAX(X) FROM MyTable)
using recent versions of JPA (or hibernate)?
I’m using Release v3.2.3 · spring-projects/spring-boot · GitHub so have access to Hibernate 6.4.4.Final
.
I’ve been struggling to put this query together just using the JPA criteria builder. I think this used to be the case with older versions and led me to using native queries instead.
Thanks for any help!
I might have answered my own question, this seems to work for me.
final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
final CriteriaQuery<BigDecimal> criteriaQuery = cb.createQuery( BigDecimal.class );
final Subquery<BigDecimal> subquery = criteriaQuery.subquery( BigDecimal.class );
final Root<MyTableEntity> subRoot = subquery.from( MyTableEntity.class );
subquery.select( cb.max( subRoot.get( "amount" ) ) );
subquery.select(criteriaBuilder.max(subRoot.get("x")));
subquery.where(criteriaBuilder.equal(subRoot.get("x"), 123)); // Equals some value
subquery.groupBy( subRoot.get( "eventId" ), subRoot.get( "rank" ) );
criteriaQuery.select( cb.sum( subquery ) );
return entityManager.createQuery(criteriaQuery).getSingleResult();
beikov
March 4, 2024, 9:31am
4
It’s possible, but you seem to have found a different way to reach the same result.
final HibernateCriteriaBuilder cb = entityManager.unwrap(Session.class).getCriteriaBuilder();
final JpaCriteriaQuery<BigDecimal> criteriaQuery = cb.createQuery( BigDecimal.class );
final JpaSubquery<BigDecimal> subquery = criteriaQuery.subquery( BigDecimal.class );
final JpaRoot<MyTableEntity> subRoot = subquery.from( MyTableEntity.class );
subquery.select( cb.max( subRoot.get( "amount" ) ).alias( "amount" ) );
subquery.select(criteriaBuilder.max(subRoot.get("x")));
subquery.where(criteriaBuilder.equal(subRoot.get("x"), 123)); // Equals some value
subquery.groupBy( subRoot.get( "eventId" ), subRoot.get( "rank" ) );
final JpaRoot<Tuple> root = criteriaQuery.from( subquery );
criteriaQuery.select( cb.sum( root.get("amount") ) );
return entityManager.createQuery(criteriaQuery).getSingleResult();
What is minimum Hibernate version for this to work?
beikov
October 7, 2024, 11:10am
6
1 Like