首页 > 解决方案 > 如何在 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()]));
}

问题是,当我使用 findAll() 的这个规范时,它返回Page<EntityClass>结果集,按 分组field,但是当我得到分页的总计数时 - 它返回不正确的计数,没有按 分组field

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

我认为是时候寻求帮助了。您能否建议任何提示我如何更改此总计数查询以进行分页?

标签: javahibernatejpa

解决方案


我正在使用这种方法:

@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>");
    }
    ...
}

推荐阅读