如何在 JPA 规范中按字段区分计数查询?

Kep*_*nik 6 java hibernate jpa

我有实现 JPA 规范接口的规范类: EntityClassSpecification implements Specification<EntityClass>

我重写了如下所示的toPredicate方法:

public Predicate toPredicate(Root<EntityClass> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
    final Collection<Predicate> predicates = new ArrayList<>();
    if (isNullOrEmpty(soilEntryCriteria.getField())) {
        query.groupBy(root.get("field"));
    }
    return cb.and(predicates.toArray(new Predicate[predicates.size()]));
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我将此规范用于 findAll() 时,它返回Page<EntityClass>结果集,按 分组field,但是当我获得分页的总计数时 - 它返回不正确的计数,而不是按 分组field

我尝试使用.distinct(true),.countDistinct(root.get("field"))并创建单独的计数查询,该查询返回 Long 值,但每次 jpql 对计数的查询都不会更改,并返回不正确的总值。

我想是时候寻求帮助了。您能否建议我如何更改分页的总计数查询的任何提示?

小智 2

我正在使用这种方法:

@Override
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) 
{

    // Count Query?
    if (query.getResultType().toString().contains("java.lang.Long")) {
        root.join("<MyJoinEntity>");
    } else {
        root.fetch("<MyJoinEntity>");
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)