Квадратные скобки для внешних предикатов генерируются правильно, но не для внутренних.
Код:
Код: Выделить всё
CriteriaBuilder criteriaBuilder = this.getEntityManager().getCriteriaBuilder();
CriteriaQuery query = criteriaBuilder.createQuery(ConfigurationKey.class);
Root configurationKeyRoot = query.from(ConfigurationKey.class);
Join configurationKeyCustomerJoin = configurationKeyRoot.join(ConfigurationKey_.customer);
final List
predicates = new ArrayList();
predicates.add(criteriaBuilder.equal(configurationKeyCustomerJoin.get(Customer_.externalId), customerId));
predicates.add(criteriaBuilder.equal(configurationKeyRoot.get(ConfigurationKey_.configType), configType));
final List orPredicates = new ArrayList();
keys.forEach((x, y) -> {
orPredicates.add(
criteriaBuilder.and(
criteriaBuilder.equal(configurationKeyRoot.get(ConfigurationKey_.keyType), x),
criteriaBuilder.equal(configurationKeyRoot.get(ConfigurationKey_.keyValue), y)
)
);
}
);
predicates.add(criteriaBuilder.or(orPredicates.toArray(new Predicate[orPredicates.size()])));
query.where(criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()])));
query.select(configurationKeyRoot);
TypedQuery typedQuery = this.getEntityManager().createQuery(query);
Код: Выделить всё
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=?)
)
Подробнее здесь: https://stackoverflow.com/questions/408 ... iteria-api