[英]JPA - How to achieve this SQL behaviour (left join parent entity to previously inner joined child & grand child entities)
我無法使用JPA / JPQL來找到達到期望結果的方法,因為我正在使用此SQL查詢:
select parent.id, child.id, grandchild.id
from salesforce.parent__c parent
left outer join salesforce.child__c child
inner join salesforce.grandchild grandchild on child.grandchild_id__c=grandchild.sfid
and (grandchild.token__c='....')
on parent.sfid=child.parent_id__c
where (parent.external_id__c is not null)
and parent.displayed__c=true
and parent.internal__c=false
and parent.date__c>='....'
and parent.date__c<='....'
order by parent.date__c asc
我要查找的查詢的目標輸出將是這樣的:
Parent Child Grandchild
P1 null null
P2 null null
P3 C1 GC1
P4 C2 GC2
凡來自父級的所有記錄均符合父級的過濾器,並且子級記錄不會返回,除非其子孫符合gc的過濾器。
我對JPQL的最佳猜測是這樣的
SELECT DISTINCT p FROM Parent p
LEFT JOIN p.childs cl
INNER JOIN cl.grandchilds c
ON c.token__c = '....'
ON cl.parent__c = p.sfid
WHERE p.external_id__c IS NOT NULL
AND p.displayed__c = true
AND p.internal__c = false
AND p.date__c >= '....'
AND p.date__c <= '....'
ORDER BY p.date__c asc
但這會拋出org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: ON
我假設我做查詢的方式就可以了:
String queryTxt = "SELECT DISTINCT p FROM Parent p LEFT JOIN p.childs cl INNER JOIN cl.grandchilds c ON c.token__c = '....' ON cl.parent__c = p.sfid WHERE p.external_id__c IS NOT NULL AND p.displayed__c = true AND p.internal__c = false AND p.date__c >= '....' AND p.date__c <= '....' ORDER BY p.date__c asc";
TypedQuery<Parent> typedQuery = entityManager.createQuery(queryTxt, Parent.class);
List<Parent> resultList = typedQuery.getResultList();
如果我嘗試使用以下JPQL,它將執行得很好:
SELECT DISTINCT p FROM Parent p
LEFT JOIN p.childs cl
INNER JOIN cl.grandchilds c
ON c.token__c = '....'
WHERE p.external_id__c IS NOT NULL
AND p.displayed__c = true
AND p.internal__c = false
AND p.date__c >= '....'
AND p.date__c <= '....'
ORDER BY p.date__c asc
但是結果不是我想要的,因為子級和孫級之間的內部聯接正在過濾掉父級記錄:
Parent Child Grandchild
P3 C1 GC1
P4 C2 GC2
我也嘗試過使用Query query = entityManager.createNativeQuery(strQuery, Parent.class);
在帖子開頭使用SQL查詢,將選擇部分替換為父部分。 ,孩子。 ,孫子。*,但是我也無法正確解析完整結構:-\\
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.