我有下面的代码块得到计数查询形式的原始查询.
但这是在编译时导致问题的行。countQuery.from(sqmSubQuery);
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Long> countQuery = builder.createQuery(Long.class);
SqmSubQuery sqmSubQuery = (SqmSubQuery<Tuple>) countQuery.subquery(Tuple.class);
SqmSelectStatement sqmOriginalQuery = (SqmSelectStatement) query;
SqmQuerySpec sqmOriginalQuerySpec = sqmOriginalQuery.getQuerySpec();
sqmSubQuery.setQueryPart(sqmOriginalQuerySpec.copy(SqmCopyContext.simpleContext()));
Root<T> subQuerySelectRoot = (Root<T>) sqmSubQuery.getRoots().iterator().next();
sqmSubQuery.multiselect(subQuerySelectRoot.get("id").alias("id"));
countQuery.select(builder.count(builder.literal(1)));
countQuery.from(sqmSubQuery);
2条答案
按热度按时间ycggw6v21#
根据您的注解,您希望选择所有员工类型的非重复计数。您提供的查询应等效于
SELECT COUNT(DISTINCT employee_type) FROM Employee
。这可以用JPA编写,如下所示:
其中
type
是Map到列employee_type
的属性的名称mwyxok5s2#
类型
org.hibernate.query.criteria.JpaSelectCriteria
声明此方法:如果您试图在from子句中使用子查询,则需要调用该函数。
并且
SqmSelectStatement
实现JpaSelectCriteria
(它也是实现jakarta.persistence.criteria.CriteriaQuery
的对象)。因此,可以将任意
CriteriaQuery
强制转换为JpaSelectCriteria
,并调用from()
:或者别的什么(我没有测试这段代码)。