Hibernate JPA-如何实现这种SQL行为(将父实体左连接到以前内部连接的子实体和孙子实体)

Hibernate JPA-如何实现这种SQL行为(将父实体左连接到以前内部连接的子实体和孙子实体),hibernate,spring-boot,jpa,jpql,heroku-connect,Hibernate,Spring Boot,Jpa,Jpql,Heroku Connect,我无法找到使用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 an

我无法找到使用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
其中,父记录中的所有记录都满足父记录的筛选器,并且除非子记录的孙子记录满足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
如果我尝试使用以下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
我还尝试了
queryquery=entityManager.createNativeQuery(strQuery,Parent.class)
在文章开头使用SQL查询,将select部分替换为parent、、child、、孙子。*,但是我也无法正确解析完整的结构:-\

您可以使用它进行任何查询并使用它对投影的支持。向我提供您的实体,我将为您起草完整的解决方案。

您可以使用其对预测的支持进行任何查询。向我提供您的实体,我将为您起草完整的解决方案

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();
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