Java 使用JPA标准API生成正确的and或条件

Java 使用JPA标准API生成正确的and或条件,java,sql,jpa,jpa-2.0,criteria-api,Java,Sql,Jpa,Jpa 2.0,Criteria Api,我试图在“或”和“和”条件中生成多个括号的查询,但没有生成内部括号。 外部谓词的括号生成正确,但内部谓词的括号生成错误。 代码: 预期查询: select configurat0_.id as id1_1_, configurat0_.createdAt as createdA2_1_, configurat0_.updatedAt as updatedA3_1_, configurat0_.configType as configTy4_1_, conf

我试图在“或”和“和”条件中生成多个括号的查询,但没有生成内部括号。 外部谓词的括号生成正确,但内部谓词的括号生成错误。 代码:

预期查询:

select
    configurat0_.id as id1_1_,
    configurat0_.createdAt as createdA2_1_,
    configurat0_.updatedAt as updatedA3_1_,
    configurat0_.configType as configTy4_1_,
    configurat0_.customerId as customer7_1_,
    configurat0_.keyType as keyType5_1_,
    configurat0_.keyValue as keyValue6_1_ 
from
    configuration_keys configurat0_ 
inner join
    customers customer1_ 
        on configurat0_.customerId=customer1_.id 
where
    customer1_.externalId=? 
    and configurat0_.configType=? 
    and (
        configurat0_.keyType=? 
        and configurat0_.keyValue=? 
        or configurat0_.keyType=? 
        and configurat0_.keyValue=?
    )
select
    configurat0_.id as id1_1_,
    configurat0_.createdAt as createdA2_1_,
    configurat0_.updatedAt as updatedA3_1_,
    configurat0_.configType as configTy4_1_,
    configurat0_.customerId as customer7_1_,
    configurat0_.keyType as keyType5_1_,
    configurat0_.keyValue as keyValue6_1_ 
from
    configuration_keys configurat0_ 
inner join
    customers customer1_ 
        on configurat0_.customerId=customer1_.id 
where
    customer1_.externalId=? 
    and configurat0_.configType=? 
    and (
        (configurat0_.keyType=? 
        and configurat0_.keyValue=?) 
        or 
        (configurat0_.keyType=? 
        and configurat0_.keyValue=?)
    )

请指出任何错误。

我打赌这是因为括号是多余的!是的,这里有答案,要么是Spring,要么是Hibernate,要么两者都有,这些问题都集中在JPA上。。。
Specifications<PcPlacement> specification = Specifications.where(null);
Specifications<PcPlacement> specificationInner = Specifications.where(null);

specificationInner = specificationInner.or(buildReferringEntitySpecificationWithContains(
                            criteria.getUserFullName(), PcPlacement_.pcUser, PcUser_.fullName));

specificationInner = specificationInner.or(buildReferringEntitySpecificationWithContains(
                            criteria.getUserEmailId(), PcPlacement_.pcUser, PcUser_.emailId));

specification = specification.and(specificationInner);
Specifications<PcPlacement> specification = Specifications.where(null);
Specifications<PcPlacement> specificationInner = Specifications.where(null);

specificationInner = specificationInner.or(buildReferringEntitySpecificationWithContains(
                            criteria.getUserFullName(), PcPlacement_.pcUser, PcUser_.fullName));

specificationInner = specificationInner.or(buildReferringEntitySpecificationWithContains(
                            criteria.getUserEmailId(), PcPlacement_.pcUser, PcUser_.emailId));

specification = specification.and(specificationInner);