JPA CriteriaBuilder count方法返回错误数据问题咨询
代码错误点
- 核心逻辑缺失:未将
filter.getBirthId()的匹配规则加入查询条件,所有birthId非空的请求查询条件都只有deleteDateTime is null,因此返回的结果都是所有未删除的Animal数据总量,自然不同birthId查询结果几乎一致。 - 分支逻辑不完整:
select和where子句仅在birthId非空时赋值,若birthId为空时调用方法,会因查询规则不完整抛出运行时异常。 - 计数逻辑不符合常规需求:当前计数对象为关联字段
birth.id,若Animal的birth关联允许为空,会自动忽略birth为null的行,若需求是统计符合条件的Animal总行数,直接统计根实体对象即可。
修复后代码
@Repository public class AnimalSearchCount { @PersistenceContext private EntityManager entityManager; Long countBy(AnimalFilter filter) { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Long> cq = cb.createQuery(Long.class); Root<Animal> animal = cq.from(Animal.class); // 全局设置统计逻辑,统计符合条件的Animal实体行数 cq.select(cb.count(animal)); // 基础过滤条件:未逻辑删除 Predicate queryCondition = cb.isNull(animal.get("deleteDateTime")); // 追加birthId匹配条件 if (filter.getBirthId() != null) { queryCondition = cb.and(queryCondition, cb.equal(animal.get("birth").get("id"), filter.getBirthId()) ); } cq.where(queryCondition); return entityManager.createQuery(cq).getSingleResult(); } }
内容的提问来源于stack exchange,提问作者HappyProgrammer
相关产品推荐
相关产品推荐

