gpt4 book ai didi

QueryDSL AND/OR 运算符不适用于 BooleanExpression

转载 作者:行者123 更新时间:2023-12-01 05:12:39 29 4
gpt4 key购买 nike

我们正在对实体进行搜索,我们正在使用 Query DSL。

表结构如下

TableA : shop -> has manytoOne relationship to TableB : Discount

我们需要建立一个谓词,它返回所有没有打折的商店
销售和也打折销售。

我们使用 MySQL 数据库和 JPA 作为我们的持久性框架。

场景是我们正在执行搜索,搜索应该找出所有没有折扣的商店和有折扣的商店。

以下是我们目前拥有的 bool 表达式。
BooleanExpression A = shop.id.eq(SomeId);
BooleanExpression B = shop.name.eq(SomeName)
BooleanExpression C = shop.discount.isNotNull;
BooleanExpression D = shop.discount.isNull;
BooleanExpression E = shop.disccount.approved.eq(SomeValue)

现在我们需要建立查询来获取所有没有折扣的商店,以及所有有折扣和 Approved 的商店。

我们尝试使用谓词
A
.and(B)
.and(D .or(C.and(D).and(E))
)

我们希望查询是
where shop.id=#someid and shop.name = 'some name' and (shop.discount is Null Or (shop.discount is not null and shop.approved='#some Value'))

但是生成的查询是什么
where  shop.id=`#someid` and shop.name = `'some name'` and (shop.discount is Null Or shop.discount is not null and shop.approved='`#some Value`')

我们没有用这个谓词得到正确的结果集,

有什么方法可以重写谓词以使其按预期工作吗?请帮助我提出建议。

谢谢
萨拉瓦纳。

最佳答案

A.and(B).and(D .or(C.and(D).and(E)))

相当于
A and B and (D or C and D and E)

请参阅此处了解 MySQL 运算符的优先级 https://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html

关于你的例子,这应该有效
shop.discount.isNull()
.or(shop.discount.isNotNull()
.and(shop.discount.approved.eq(SomeValue)))

关于QueryDSL AND/OR 运算符不适用于 BooleanExpression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23509502/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com