【问题标题】:Spring JPA CriteriaBuilder not producing correct SQLSpring JPA CriteriaBuilder 未生成正确的 SQL
【发布时间】:2022-11-11 05:11:52
【问题描述】:

我有以下标准构建器声明:

    CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
    CriteriaQuery<TestEntity> criteriaQuery = criteriaBuilder.createQuery(TestEntity.class);
    Root<TestEntity> itemRoot = criteriaQuery.from(TestEntity.class);
    criteriaQuery.select(itemRoot);

    javax.persistence.criteria.CriteriaBuilder.In inClause = criteriaBuilder.in(itemRoot.get("cost"));
    inClause.value(criteriaBuilder.literal(5.0d));

    javax.persistence.criteria.CriteriaBuilder.In inClause2 = criteriaBuilder.in(itemRoot.get("cost"));
    inClause2.value(criteriaBuilder.literal(5.0d));

    Predicate pred = criteriaBuilder.or(inClause, criteriaBuilder.and(inClause2, criteriaBuilder.like(itemRoot.get("name"), "%name%")));
    criteriaQuery.where(pred);
    TypedQuery typedQuery = entityManager.createQuery(criteriaQuery);
    List<TestEntity> list = typedQuery.getResultList();

这会产生以下 sql :

select *
from test_entity testentity0_ 
where
    testentity0_.cost in (
        5.0
    ) 
    or (
        testentity0_.cost in (
            5.0
        )
    ) 
    and (
        testentity0_.name like ?
    )

但是 where 子句是错误的,我希望以下内容:

select *
from test_entity testentity0_ 
where
    testentity0_.cost in (
        5.0
    ) 
    or (
        testentity0_.cost in (
            5.0
        )
        and (
            testentity0_.name like ?
        )
    ) 

and 放错了位置,它应该放在 or 语句的第二个表达式中

【问题讨论】:

    标签: jpa criteriabuilder


    【解决方案1】:

    这两个表达式是等价的,因为and 运算符优先于or:

    A or B and C 等价于 A or (B and C)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 2012-06-23
      相关资源
      最近更新 更多