Как использовать спецификацию, чтобы сделать два условия "ИЛИ" с несколькими условиями "И" в запросе MySQL
Я хочу сделать следующий запрос с помощью спецификации
select * from table where (order_quantity > 0 or product_verified = false) and sku = "12345";
ниже мой код, но я получил неправильный набор результатов
Specification<JitOrderItem> specification = JitOrderItemSpecification.findAll();
specification = Specifications.where(specification).and(
Specifications.where(specification).or(JitOrderItemSpecification.filterByJitOrderQuantityGreaterThan(0))
.or(Specifications.where(specification).and(JitOrderItemSpecification.filterByProductVerified(false)))
);
specification = Specifications.where(specification).and(JitOrderItemSpecification.filterBySku(sku));
1 ответ
Я предполагаю, что вы используете JPA, вероятно, в спящем режиме. Вы можете включить ведение журнала (для hibernate это "org.hibernate.sql" для отладки). Таким образом, вы можете увидеть сгенерированный запрос, который может помочь вам в их отладке.
Глядя на ваш код, ваша окончательная спецификация будет выглядеть примерно так:
Specifications.where(
Specifications.where(JitOrderItemSpecification.findAll())
.and(
Specifications.where(JitOrderItemSpecification.findAll())
.or(JitOrderItemSpecification.filterByJitOrderQuantityGreaterThan(0))
.or(Specifications.where(JitOrderItemSpecification.findAll()).and(JitOrderItemSpecification.filterByProductVerified(false)))
)
)
.and(JitOrderItemSpecification.filterBySku(sku));
Вы в основном запрашиваете следующее (только предложение WHERE):
(
ALL JitOrderItems
AND
(
ALL JitOrderItems
OR
OrderQuantityGreaterThan 0
OR
(
ALL JitOrderItems
AND
ProductVerified false
)
)
)
AND
JitOrderItemSpec.filterBySku(sku)
Что вы хотите, вероятно, это следующее:
Specifications.where(
JitOrderItemSpecification.filterByJitOrderQuantityGreaterThan(0).or(JitOrderItemSpecification.filterByProductVerified(false)))
.and(JitOrderItemSpecification.filterBySku(sku));