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

时间:2018-10-18 10:02:31

标签: java hibernate jpa

我有实现JPA Specification接口的Specification类: 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查询计数都不会改变,并且返回不正确的总值。

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

1 个答案:

答案 0 :(得分:0)

我正在使用这种方法:

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