java - 如何使用规范在mysql查询中使用多个 "OR"条件创建两个 "AND"条件

标签 java spring spring-boot spring-data-jpa jpa-criteria

我想在规范的帮助下进行以下查询

从表中选择*,其中(order_quantity > 0 或product_verified = false)且 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));

最佳答案

我假设您正在使用 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));

关于java - 如何使用规范在mysql查询中使用多个 "OR"条件创建两个 "AND"条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52088960/

相关文章:

java - Tomcat 服务器在移入 docker 容器后生成 `Could not initialize class javax.imageio.ImageIO` 错误

java - 如何在java方法中使用泛型

java - Apache Camel : How to iterate over list and call rest api?

java - 以编程方式使 Java Web 应用程序重新启动时的所有 session 过期

spring - Cloudbees、Tomcat 和 Spring : "Cannot create JDBC driver of class ' ' for connect URL 'null' "

java - 使用带有 Spring Boot 和 Spring Security 的 javafx 客户端

eclipse - Eclipse 中的 "mvn spring-boot:run"和 "Add to Tomcat server"有什么区别?

java - Spring 数据 jpa LazyInitializationException : no Session

spring-boot - 如何使用 YAML 为 Logback/Springboot 配置多个日志文件?

java - Spring Boot插件需要Gradle 4.10或更高版本。当前版本是Gradle 4.1