2014-09-23 3 views
1

JPQL로 변환 된 매우 정교한 SQL 쿼리가 있습니다. 갑자기, 2.0 이전의 OPENJPA 1.2.8 버전이기 때문에 ON-Clause가 작동하지 않습니다. 그래서, 아마도 나는 Left Open Join을 사용할 수 없을 것입니다. 이 경우 가장 좋은 전략은 무엇일까요?ON-CLAUSE가 허용되지 않는 경우 JPQL에서 LEFT OUTER JOIN을 대체하는 방법은 무엇입니까?

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; 
+1

'ON' 절은 표준 ANSI SQL이며 수년간 사용해 왔습니다. 구문이 지원되지 않으면 이상하게 보일 것입니다. 그러나, 아마도 SELECT * FROM a, b WHERE a.id = b.id' 대신에 SELECT * FROM a JOIN B ON을 사용할 수 있습니다. a.id = b.id' – SchmitzIT

+0

감사합니다,하지만 귀하의 제안은 내부 조인을위한 –

답변

0

나는 네이티브 쿼리를 사용 끝났다. 그래서 작동하는 코드 덩어리는 다음과 같습니다 :

........... 
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]; 
...........