java - 如何在 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 查询计数都不会改变,并返回不正确的总值。
我认为是时候寻求帮助了。您能否建议任何提示我如何更改此总计数查询以进行分页?
解决方案
我正在使用这种方法:
@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>");
}
...
}
推荐阅读
- python - 我可以使用 sublime Text 构建系统在 docker 容器中执行 manage.py 命令吗?
- javascript - 如何在nodejs上使用对象json数据进行嵌套循环
- ios - 开始开发 iOS 应用程序 (Swift) - 添加按钮不再起作用
- python - 在 1 个串行上结合 2 个伺服器和传感器
- javascript - 使用 await 和 r2 等待 HTTP 响应,然后再进一步
- python - 我在 Python 3.6 中收到错误“os.chdir(saved_path) 处的无效错误”
- c# - 基于 Unity 网格的建筑(捕捉到网格)并在捕捉时跟随鼠标
- android - 构建 apk 失败并出现错误:包 android.arch.core.util 不存在
- python - 将 python 列表转换为 tsv 格式以便在 memsql 中输入
- html - 当我放大所有元素时,我希望页面在我放大时位于中心