gpt4 book ai didi

java - JPQL:OR 不会按预期工作

转载 作者:行者123 更新时间:2023-12-02 10:58:29 25 4
gpt4 key购买 nike

我在存储库中定义了以下方法:

@Query("SELECT t FROM Treatment t WHERE " +
" (t.promotionCode.promotion.id=:promotionId) " +
" order by t.id desc")
Page<Treatment> findByPromotionId(@Param("promotionId")Integer id, Pageable pr);

它按预期工作:我得到了一个治疗列表,其中包含属于给定促销的促销代码。

但随后我需要添加第二个促销代码,因此一个治疗可以链接到最多两个促销(两个促销代码可能属于同一个促销,这不是问题)。所以我尝试将新的要求添加到查询中:

@Query("SELECT t FROM Treatment t WHERE " +
" (t.promotionCode.promotion.id=:promotionId) " +
" OR " +
" (t.promotionCode2.promotion.id=:promotionId) " +
" order by t.id desc")
Page<Treatment> findByPromotionId(@Param("promotionId")Integer id, Pageable pr);

但是我不会工作。生成的SQL为

select ...
from treatment treatment0_
cross join promotion_code promotionc1_
cross join promotion_code promotionc2_
where
treatment0_.promotion_code_id=promotionc1_.id and
treatment0_.promotion_code2_id=promotionc2_.id and
(promotionc1_.promo_id=? or promotionc2_.promo_id=?)
order by
treatment0_.id desc limit ?

正如您所注意到的,一旦其中一个促销代码为空,则表示不满足条件。

一些细节,即使它们从代码中显而易见:

  • 除了treatment之外,还有一个名为promotion_code的表和另一个名为promotion的表。
  • 所有表都有一个数字 ID(自动递增)。
  • promotion_code_idpromotion_code2_id 是指向 promotion_code 的 FK,它也有一个指向 promotion 的 FK,但它不能为空(所有促销代码都属于促销 Activity )。

我想查找通过任何促销代码列链接到促销的所有治疗。两个字段都可以为空。

我该如何解决这个问题?

最佳答案

您可以尝试使用条件 API。

CriteriaBuilder 接口(interface)提供了工厂方法,该方法采用两个表达式操作数(包括 Predicate 实例)并返回一个新的 Predicate 实例:

  Predicate p1 = cb.and(isInUN, isInEU);  // Member of both UN and EU
Predicate p2 = cb.or(isInOECD, isLarge); // Either OECD member or large

其他工厂方法可用于不同数量的谓词:

  Predicate p3 = cb.and(p1, isLarge, cb.isTrue(isInOECD));
Predicate p4 = cb.or(p2, cb.isTrue(isInUN), cb.isTrue(isInEU));

在上面的代码中,非 Predicate boolean 表达式使用 isTrue 方法转换为 Predicate 实例。这是必需的,因为在非二进制版本中,工厂方法只接受 Predicate 实例作为参数。

来源网址:https://www.objectdb.com/java/jpa/query/jpql/logical#Criteria_Query_Logical_Operators_

关于java - JPQL:OR 不会按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51534611/

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