我有以下实体关系(在 Kotlin 中):
发票实体:
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "contact")
var contactEntity: ContactEntity?,
联系实体:
@OneToOne(mappedBy = "contactEntity", fetch = FetchType.EAGER)
var accountingContactEntity: AccountingContactEntity?
会计联系实体:
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "contact")
var contactEntity: ContactEntity?
当我执行查询方法时
@EntityGraph(
attributePaths = ["contactEntity"],
type = EntityGraph.EntityGraphType.LOAD
)
findByDateBetween(...): Set<InvoiceEntity>
然后我希望查询包含JOIN
Contact-Entity 和 AccountingContactEntity。
但是AccountingContactEntity 缺少它。SELECT
相反,为每个 AccountingContactEntity (N+1) 执行一个额外的。不应该EntityGraph.EntityGraphType.LOAD
触发对 ContactEntity 中 FetchType.EAGER 注释的识别,强制JOIN
为 AccountingContactEntity 吗?
唯一有效的是添加"contactEntity.accountingContactEntity"
到 EntityGraph。
没有其他解决方案吗?
顺便说一句,如果我设置 @OneToOne(fetch = FetchType.EAGER)
InvoiceEntity 的 contactEntity 并执行一个 normal find(invoiceId)
,那么两个表都会按预期加入。