Как использовать спецификацию, чтобы сделать два условия «ИЛИ» с несколькими условиями «И» в запросе MySQL - PullRequest
0 голосов
/ 30 августа 2018

Я хочу сделать следующий запрос с помощью спецификации

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 Ответ

0 голосов
/ 30 августа 2018

Я предполагаю, что вы используете 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));
...