java - 如何使用规范在mysql查询中使用多个“AND”条件创建两个“OR”条件
问题描述
我想在规范的帮助下进行以下查询
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));
解决方案
我假设您正在使用 JPA,可能是休眠的。您可以启用日志记录(对于休眠,它是“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));
推荐阅读
- django - Django通过信号保存在另一个表中
- python - postgresql 中的查询转换为 Django orm
- amazon-web-services - 在 AWS 控制台中编辑 AWS Glue 驱动程序脚本时出现奇怪的行为
- html - 将 api 中的项目放入反应列表中
- android-studio - 无法将 Android Studio 4.1.2 更新到 Android Studio 2020.3.1 arctic fox
- r - 与 grand_summary_rows() 函数无关的错误:`mutate()` 输入 `...` 有问题。x 输入 `...` 不能被回收到大小 1
- python - fake_useragent 模块连接不正确 - IndexError: list index out of range
- android - 安装启动失败后 Android Studio 无法启动
- python - 如何在python中动态添加for循环
- qt - 如何在安装 Qt Installer Framework 生成的安装文件前自动卸载