簡體   English   中英

JPA-如何實現此SQL行為(左聯接父實體到先前內部聯接的子實體和大子實體)

[英]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查詢,將選擇部分替換為父部分。 ,孩子。 ,孫子。*,但是我也無法正確解析完整結構:-\\

您可以使用FluentJPA進行任何查詢,並將其Tuple支持用於投影。 提供我您的實體,我將為您起草完整的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM