Спецификация Spring JPA, где скобка условия

#java #spring #spring-data-jpa

#java #spring #spring-data-jpa

Вопрос:

Как я могу использовать спецификацию spring JPA для условия where, как показано ниже:

Где cond1 и (cond2 или cond3)

И

Где (cond1 и cond2) или cond3.

Код спецификации выглядит следующим образом:

 Specification<DocRecord> updatedAtAndCountGTZeroSpec = new Specification<DocRecord>() {

    @Override
    public Predicate toPredicate(Root<DocRecord> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
        return cb.or(
            (cb.and(
                cb.lessThanOrEqualTo(root.get("updatedAt"),new Timestamp(now.getTimeInMillis())),
                cb.lessThan(root.get("attemptCount"), 3))
            ),
            (cb.equal(root.get("attemptCount"), 0))
        );
    }
};
  

Выше указано производство, где условие, как показано ниже:

где docrecord0_.updated_at < ? и docrecord0_.attempt_count<3 или docrecord0_.attempt_count=0

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

1. Ну, вы сделали второе. В чем проблема?

2. Как достичь первого. Моя главная забота заключается в том, чтобы заключить в скобки спецификацию.

3. cb.and(cond1, cb.or(cond2, cond3)) ? Не уверен, что понимаю вашу проблему…

4. Во втором фрагменте у вас есть два условия, разделенные or . Итак, вы начинаете с cb.or . В вашем первом фрагменте два основных условия разделены символом и, поэтому начните с cb.and . Я не понимаю, в чем сложность.

Ответ №1:

Вы можете создать спецификацию «ИЛИ», затем добавить спецификацию «И» для первой

 Specification<?> spec = spec1.or(spec2);
spec = spec.and(spec3);
  

спецификация фактически равна (spec1 ИЛИ spec2) И spec3