首页 > 解决方案 > JPQL 不是预测的方法吗?

问题描述

这是我试图调用的存储库方法。

@Query(value = "select ise from InquirySession ise " +
        "inner join ise.inquiryRequest.inquiryRequestFacilities irf " +
        "left outer join ise.inquiryResponses ire on ire.facilityId = ?2 " +
        "left outer join ire.responseActions ira " +
        "left outer join ire.acceptDates irad " +
        "left outer join ire.responseReasons irr " +
        "where ise.carePathItem.id = ?1 and irf.facilityId = ?2")
    Set<InquirySession> getAllByCarePathItemIdAndProviderId(final Long carePathItemId, final Long providerId);

我的想法是,当执行此方法时,ise.inquiryResponses将使用 JPQL 中定义的附加“on”子句加入到 InquirySession。但是,我认为此 JPQL 仅选择 InquirySession 并单独调用以加入所有其他实体(在 InquirySession 中定义),因为在使用主/外键关系加入每个实体之后,我看到了单独的 sql 语句。

这是 InquiryResponse 在 InquirySession 中的样子

@OneToMany(mappedBy = "inquirySessionId")
@OrderBy(value = "createDate")
private Set<InquiryResponse> inquiryResponses;

反之亦然,

@Column(name = "inquirySessionDatabaseKey")
private Long inquirySessionId;

使用 JPQL 水合 InquirySession 实体时,是否可以将 InquiryResponse 与附加的 on子句 ire.facilityId = ?2 结合起来?

编辑

JPQL 等效 SQL

select inquiryses0_.inquirySessionId as inquirySessionId1_36_, inquiryses0_.carepathitemid as CarePat12_36_, inquiryses0_.createDate as createDa2_36_, inquiryses0_.description as descript3_36_, 
inquiryses0_.fileSize as fileSize4_36_, inquiryses0_.documentLink as inquiryS5_36_, inquiryses0_.numberOfPages as numberOf6_36_, inquiryses0_.patientId as patientId7_36_, 
inquiryses0_.patientEncounterId as patientV8_36_, inquiryses0_.patientplannerid as patientplannerid13_36_, inquiryses0_.purgedOn as purgedOn9_36_, inquiryses0_.amazonbucketname as s10_36_, 
inquiryses0_.type as type11_36_ 
from InquirySession inquiryses0_ 
inner join InquiryRequest inquiryreq1_ on inquiryses0_.inquirySessionId=inquiryreq1_.inquirySessionId 
inner join InquiryRequest_Facility inquiryreq2_ on inquiryreq1_.inquiryrequestid=inquiryreq2_.inquiryrequestid 
left outer join InquiryResponse inquiryres3_ on inquiryses0_.inquirySessionId=inquiryres3_.inquirySessionId and (inquiryres3_.providerId=?) 
left outer join InquiryResponse_Action_Link inquiryres3_1_ on inquiryres3_.inquiryresponseid=inquiryres3_1_.inquiryresponseid 
left outer join InquiryResponseActions inquiryres4_ on inquiryres3_1_.inquiryresponseactionid=inquiryres4_.inquiryresponseactionid 
left outer join InquiryResponse_AcceptDate_Link acceptdate5_ on inquiryres3_.inquiryresponseid=acceptdate5_.inquiryresponseid 
left outer join InquiryResponse_Reason_Link responsere6_ on inquiryres3_.inquiryresponseid=responsere6_.inquiryresponseid 
left outer join InquiryResponseReasons inquiryres7_ on responsere6_.responsereasonid=inquiryres7_.responsereasonid 
where inquiryses0_.carepathitemid=? and inquiryreq2_.providerId=?

不遵守“on”子句并仅在 InquirySession.inquirySessionId 上加入的 SQL

select inquiryres0_.inquirySessionId as inquirySessionId5_30_0_, inquiryres0_.inquiryresponseid as inquiryresponseid1_30_0_, inquiryres0_.inquiryresponseid as inquiryresponseid1_30_1_, inquiryres0_.createDate as createDa2_30_1_, 
inquiryres0_.providerId as providerId3_30_1_, inquiryres0_.alsoCallMe as alsoCall4_30_1_, inquiryres0_.inquirySessionId as inquirySessionId5_30_1_, inquiryres0_.phoneNumber as phoneNum6_30_1_, 
inquiryres0_.respondedBy as responde7_30_1_, inquiryres0_.responseText as response8_30_1_, inquiryres0_.responseTypeID as response9_30_1_, 
inquiryres0_1_.inquiryresponseactionid as RSPNS_AC1_32_1_, inquiryres1_.inquiryresponseactionid as RSPNS_AC1_34_2_, inquiryres1_.inquiryresponseactiondescription as RSPNS_AC2_34_2_ 
from InquiryResponse inquiryres0_ 
left outer join InquiryResponse_Action_Link inquiryres0_1_ on inquiryres0_.inquiryresponseid=inquiryres0_1_.inquiryresponseid 
inner join InquiryResponseActions inquiryres1_ on inquiryres0_1_.inquiryresponseactionid=inquiryres1_.inquiryresponseactionid 
where inquiryres0_.inquirySessionId=? order by inquiryres0_.createDate

查看第一个 SQL,很明显 JPQL 并不真正关心在 InquirySession 中加入其他实体,因为所有选择语句都是针对 InquirySession 表的。它执行单独的SELECT语句来加入 InquiryResponse,因此不再具有预期的附加ON子句。

标签: javajpaspring-data-jpajpql

解决方案


推荐阅读