QueryDSL AND / OR运算符不使用BooleanExpression

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

表结构如下

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

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

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

场景是我们正在进行搜索,搜索应该可以获得所有没有折扣的商店和批准折扣的商店.

以下是我们目前所拥有的布尔表达式.

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)

现在我们需要建立查询以获得所有没有折扣的商店,以及所有有折扣和批准的商店.

我们尝试使用谓词

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`')

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

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

谢谢
Saravana.

最佳答案

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)))
点赞