有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用规范在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) 个答案

  1. # 1 楼答案

    我假设你正在使用JPA,可能是hibernate。您可以启用日志记录(对于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));