【问题标题】:How to substitute LEFT OUTER JOIN in JPQL if ON-CLAUSE is not allowed?如果不允许使用 ON-CLAUSE,如何在 JPQL 中替换 LEFT OUTER JOIN?
【发布时间】:2014-09-23 17:19:20
【问题描述】:

我已将相当复杂的 SQL 查询转换为 JPQL。突然,我发现因为我在 2.0 之前的 OPENJPA 1.2.8 版本上,所以 ON-Clause 不起作用。所以,很可能我不能使用左开连接。在这种情况下,最好的策略是什么?

JPQL 查询:

select priceListTerm.SELLING_PRICE, priceListTerm.COMMISSION_FORMAT, priceListTerm.COMMISSION,  
priceListAssignment.EFF_START_DATE, priceListAssignment.EFF_END_DATE, 
priceListAssignment.PRIORITY_LEVEL, 
venue.CODE, tb.HEADQUARTERS, vendor.NAME from PriceListTerm priceListTerm
JOIN PriceList priceList on priceListTerm.PRICELIST_UID = priceList.UIDPK
JOIN ProductSku productsku on priceListTerm.PRODUCTSKU_UID=productsku.UIDPK
LEFT OUTER JOIN 
(PriceListAssignment priceListAssignment JOIN Venue venue on   
 priceListAssignment.VENUE_UID=venue.UIDPK
 JOIN Vendor vendor on vendor.UIDPK=venue.VENDOR_UID)
on priceListAssignment.PRICELIST_UID = priceList.uidpk
where productsku.skuCode= :sku 
and (vendor.name is null or vendor.name= :vendor)
order by priceListAssignment.PRIORITY_LEVEL;

【问题讨论】:

  • ON 子句是标准的 ANSI SQL,并且已经存在多年。如果不支持该语法会很奇怪。但是,您可以(可能)使用SELECT * FROM a, b WHERE a.id = b.id 而不是SELECT * FROM a JOIN b ON a.id = b.id
  • 谢谢,但您的建议是内部加入

标签: mysql sql openjpa outer-join


【解决方案1】:

我最终使用了本机查询。所以工作的代码块如下:

...........
query = entityManager.createNativeQuery(GET_LOGICAL_SQL);

List<Object[]> list  = query.setParameter(1, skuCode).setParameter(2, vendorName).getResultList();

for (Object[] objects : list){
    BigDecimal sellingPrice = (BigDecimal)objects[0];
...........

【讨论】:

    猜你喜欢
    • 2015-05-19
    • 2011-06-26
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多