Объединение Предикатов JPA И/Или Критериев

#java

#Ява

Вопрос:

Я хочу запросить, например: (артикул = «A» И uom_code = «B») ИЛИ (артикул = C» И uom_code = «D»)

Но мой предикат генерирует такие значения, как (артикул = «A» И uom_code = «B» ИЛИ артикул = » C «И uom_code = «D»)

как это исправить. Спасибо.

 public class VariantSpecification implements Specificationlt;VariantModelgt; {  private final VariantFilter filter;  public VariantSpecification(VariantFilter filter) {  this.filter = filter; }  @Override public Predicate toPredicate(  Rootlt;VariantModelgt; root,  CriteriaQuerylt;?gt; query,  CriteriaBuilder cb ) {  final Listlt;Predicategt; predicates = new ArrayListlt;gt;();   if (filter.getMerchantId() != null) {  predicates.add(cb.equal(root.get("merchantId"), filter.getMerchantId()));  }   Predicate predicate = cb.and(predicates.toArray(new Predicate[0]));   Listlt;Predicategt; predicatesMap = new ArrayListlt;gt;();  if (!CollectionUtils.isEmpty(filter.getSkusUoms())) {  filter.getSkusUoms().forEach(pair -gt; {  String sku = pair.getLeft();  String uom = pair.getRight();  Predicate predicateSku = cb.equal(root.get("sku"), sku);  Predicate predicateUom = cb.equal(root.get("uomCode"), uom);  predicatesMap.add(cb.or(cb.and(predicateSku, predicateUom)));  });  }    if (!predicatesMap.isEmpty()) {  Predicate predicateSector = cb.or(predicatesMap.toArray(new Predicate[0]));  return cb.and(predicate, predicateSector);  }  return predicate; }  

}

Комментарии:

1. Есть ли разница в результатах? AND должно иметь приоритет над OR

2. @csalmhof: да, это другое. Если у него нет символа в скобках. Результат неожиданный.

Ответ №1:

Да, моя ошибка.,

 SELECT ... FROM ... WHERE (expression1 AND expression2) OR (expression3 AND expression4)    SELECT ... FROM ... WHERE expression1 AND expression2 OR expression3 AND expression4    According to the SQL specification, both statements mean the same thing. It doesn't matter whether the statement contains the () or not, so Hibernate doesn't use them. The order of precedence is like this, similar to 1 2*3 is the same as 1 (2*3).