#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