Hibernate JPA-如何实现这种SQL行为(将父实体左连接到以前内部连接的子实体和孙子实体)
我无法找到使用JPA/JPQL实现预期结果的方法,因为我使用的是以下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
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