java - 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子句。
解决方案
推荐阅读
- reactjs - 如何编写反应钩子 HOC
- python - 为什么此代码不是多线程的(尝试使用 pandas read_csv 分块读取文件并在单独的线程中处理每个块)
- c++ - 具有无效输入的映射返回映射的第一个插入值
- docker - 使 docker 上的秘密文件尽可能安全,分别替代隐藏敏感信息的方法
- php - Brew 服务无法启动
- python - 由于输入结束,jira.create_sprint() 返回 JiraError HTTP 500 No Content to map to Object
- testing - DBT Source.yml 中的测试和文档
- java - new View.OnClickListener() 显示为灰色
- python - Python:直方图返回错误的计数值(编辑:更一般的示例)
- java - Spring Batch FlatFileItemWriter - 将带有列表的对象作为字段写入 CSV 文件