You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 15:36:03