首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPQL:或者不会像预期的那样工作

JPQL:或者不会像预期的那样工作
EN

Stack Overflow用户
提问于 2018-07-26 08:42:56
回答 2查看 66关注 0票数 0

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

代码语言:javascript
复制
@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);

正如预期的那样:我得到了一份清单,其中列出了属于特定促销活动的PromotionCode。

但是,我需要添加第二个升级代码,这样就可以将处理链接到最多两个晋升(两个促销代码都可能属于相同的促销,这不是问题)。因此,我尝试将新的需求添加到查询中:

代码语言:javascript
复制
@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是

代码语言:javascript
复制
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 ?

您可以注意到,一旦其中一个促销代码为null,条件就不会满足。

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

  • 除了treatment之外,还有一个表名为promotion_code,另一个表名为promotion
  • 所有表都有一个数字ID (自动递增)。
  • promotion_code_idpromotion_code2_idpromotion_code的FKs切入点,它也有FK到promotion,不能为null (所有升级代码都属于促销)。

我希望找到由任何促销代码列链接到促销的所有处理方法。这两个字段都可能为空。

我怎么才能解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-26 09:54:29

我试着模仿联盟,结果成功了:

代码语言:javascript
复制
SELECT t
FROM Treatment t 
WHERE t IN (SELECT t FROM Treatment t 
      WHERE t.promotionCode.promotion.id = :promotionId)
  OR t IN (SELECT t FROM Treatment t
      WHERE t.promotionCode2.promotion.id = :promotionId)
ORDER BY t.id desc

在此之前,我尝试了左联接提取选项。

代码语言:javascript
复制
SELECT t 
FROM Treatment t 
LEFT JOIN t.promotionCode.promotion as pc
LEFT JOIN t.promotionCode2.promotion as pc2
WHERE 
  (pc.id=:promotionId)  
OR (pc2.id=:promotionId)  
order by t.id desc

并使用

代码语言:javascript
复制
SELECT t 
FROM Treatment t 
LEFT JOIN t.promotionCode as pc
LEFT JOIN t.promotionCode2 as pc2
WHERE 
  (pc.promotion.id=:promotionId)  
OR (pc2.promotion.id=:promotionId)  
order by t.id desc

但是它们没有工作(我得到了很长的堆栈跟踪,表示在启动应用程序时查询是不正确的),

票数 0
EN

Stack Overflow用户

发布于 2018-07-26 09:11:54

您可以尝试使用标准API。

CriteriaBuilder接口提供了接受两个表达式操作数(包括谓词实例)并返回一个新谓词实例的工厂方法:

代码语言:javascript
复制
  Predicate p1 = cb.and(isInUN, isInEU);  // Member of both UN and EU
  Predicate p2 = cb.or(isInOECD, isLarge); // Either OECD member or large

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

代码语言:javascript
复制
  Predicate p3 = cb.and(p1, isLarge, cb.isTrue(isInOECD));
  Predicate p4 = cb.or(p2, cb.isTrue(isInUN), cb.isTrue(isInEU));

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

来源网址:_

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51534611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档