createCountQuery() failing in Hibernate 6.4.2.Final

I’m trying to migrate my service from hibernate to latest and facing lots of issues. I resolved many with the discussions done in the forum. But I now am facing issue in count Query published in latest version of hibernate.

I have a utility class that executes a query and collects list of values and the count. I implemented my logic based on [HHH-17410] Support creating count query from existing query - Hibernate JIRA (atlassian.net). But I am facing issue while executing count query alone

List<T> ResultSet = entityManager.createQuery(this.criteriaQuery).getResultList(); // returns list output for query
var countQuery = ((SqmSelectStatement) this.criteriaQuery).createCountQuery();
return (Long) entityManager.createQuery(countQuery).getSingleResult(); // throws NullPointerException (attached below)
Cannot invoke "org.hibernate.query.sqm.SqmPathSource.getSqmPathType()" because the return value of "org.hibernate.metamodel.model.domain.EntityDomainType.getIdentifierDescriptor()" is null
java.lang.NullPointerException: Cannot invoke "org.hibernate.query.sqm.SqmPathSource.getSqmPathType()" because the return value of "org.hibernate.metamodel.model.domain.EntityDomainType.getIdentifierDescriptor()" is null
	at org.hibernate.query.derived.AnonymousTupleType.addColumnNames(AnonymousTupleType.java:121)
	at org.hibernate.query.derived.AnonymousTupleType.determineColumnNames(AnonymousTupleType.java:103)
	at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.consumeFromClauseRoot(BaseSqmToSqlAstConverter.java:2770)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.hibernate.query.sqm.tree.from.SqmFromClause.visitRoots(SqmFromClause.java:80)
	at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitFromClause(BaseSqmToSqlAstConverter.java:2573)
	at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitQuerySpec(BaseSqmToSqlAstConverter.java:2055)
	at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitQuerySpec(BaseSqmToSqlAstConverter.java:440)
	at org.hibernate.query.sqm.tree.select.SqmQuerySpec.accept(SqmQuerySpec.java:127)
	at org.hibernate.query.sqm.spi.BaseSemanticQueryWalker.visitQueryPart(BaseSemanticQueryWalker.java:218)
	at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitQueryPart(BaseSqmToSqlAstConverter.java:1915)
	at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitSelectStatement(BaseSqmToSqlAstConverter.java:1600)
	at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitSelectStatement(BaseSqmToSqlAstConverter.java:440)
	at org.hibernate.query.sqm.tree.select.SqmSelectStatement.accept(SqmSelectStatement.java:228)
	at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.translate(BaseSqmToSqlAstConverter.java:776)
	at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.buildCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:402)
	at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:327)
	at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:303)
	at org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:509)
	at org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:427)
	at org.hibernate.query.spi.AbstractSelectionQuery.getSingleResult(AbstractSelectionQuery.java:564)
	at com.xxx.cloud.flingo.hiberlingo.JPAEntityCriteriaBuilder.count(JPAEntityCriteriaBuilder.java:294)
	at com.xxx.cloud.flingo.hiberlingo.DataAccess.getValues(DataAccess.java:166)
	at com.xxx.cloud.flingo.hiberlingo.DataAccess.getValues(DataAccess.java:130)
	at com.xxx.orgexpiry.odata.service.ODataHelperService.fetch(ODataHelperService.java:42)
	at com.xxx.orgexpiry.odata.controller.StateAuditController$1.getEntities(StateAuditController.java:44)
	at com.xxx.orgexpiry.odata.AuditControllerTest.testEnumFilters(AuditControllerTest.java:136)

Am I missing something here? Can someone help on this?

Looks like a bug, so please try to create a reproducer with our test case template and if you are able to reproduce the issue, create a bug ticket in our issue tracker and attach that reproducer.

Hi @beikov
I’m not sure but I am at this

JpaCriteriaQuery cq = ((SqmSelectStatement) this.criteriaQuery).createCountQuery();
return this.entityManager.createQuery(cq).getSingleResult();

could not prepare statement [Syntax error in SQL statement "SELECT COUNT(*) FROM (SELECT 1 FROM DDS_TAB O1_0) DERIVED1_0([*]C0) "; SQL statement:
select count(*) from (select 1 from dds_tab o1_0) derived1_0(c0) [42000-182]]

Stacktrace
org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:91)"
org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:58)"
org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:108)"
org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:194)"
org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:155)"
org.hibernate.sql.exec.spi.JdbcSelectExecutor.lambda$list$0(JdbcSelectExecutor.java:85)"
org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.executeQuery(DeferredResultSetAccess.java:231)"
org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.getResultSet(DeferredResultSetAccess.java:167)"
org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.advanceNext(JdbcValuesResultSetImpl.java:218)"
org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.processNext(JdbcValuesResultSetImpl.java:98)"
org.hibernate.sql.results.jdbc.internal.AbstractJdbcValues.next(AbstractJdbcValues.java:19)"
org.hibernate.sql.results.internal.RowProcessingStateStandardImpl.next(RowProcessingStateStandardImpl.java:66)"
org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:203)"
org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:33)"
org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:209)"
org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:83)"
org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:76)"
org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:65)"
org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.lambda$new$2(ConcreteSqmSelectQueryPlan.java:137)"
org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:359)"
org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:300)"
org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:509)"
org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:427)"
org.hibernate.query.spi.AbstractSelectionQuery.getSingleResult(AbstractSelectionQuery.java:564)"

The query is simple though.

Apparently you use an unsupported database or use a Dialect that doesn’t work with the database.

@beikov The issue occurred in UTs where I am using In memory H2 database where I tried with both MySQLDialect and H2Dialect and getting the same response.

I don’t know what UT is, but for a H2 database you have to use the H2 dialect. Also note, that Hibernate ORM 6.4 only supports H2 version 2.1.214+