我有两个看起来像这样的实体:
@Entity
class TimeRange(
@Id val id: UUID,
val startTime: Instant,
val endTime: Instant,
...
)
@Entity
class StepInProcess(
@Id val id: UUID,
val projectId: UUID,
@OneToOne()
@JoinColumn(name = "range_id", referencedColumnName = "id")
val timeRange: TimeRange,
...
)
我的存储库看起来像:
@Repository
interface StepInProcessRepository : JpaRepository<StepInProcess, UUID> {
fun findAllByProjectId(projectId: UUID): List<StepInProcess>
}
每当我检索一个步骤列表时,我几乎总是需要访问相关startTime
上的TimeRange
。这些中的每一个都要求发出单独的查询以检索最终真正低效的时间范围实体。理想情况下,我想指示Hibernate总是立即检索这些数据,理想情况是使用连接,而不是需要单独选择。
将@Fetch(FetchMode.JOIN)
添加到timeRange
似乎应该按照我的意愿行事,但似乎并非如此(或者我错过了其他内容)。我的目的是看看调试日志,显示Hibernate为select
实体发出大量TimeRange
语句;不确定是否有更好的诊断方法。
或者,我可以推荐startTime
和endTime
作为Step本身的属性,但我也不清楚如何实现这一点。我不想要在两个实体之间创建继承关系,因为说“步骤”是一个“时间范围”并不公平。
@Fetch
是正确的方法吗?如果是这样,除了向该属性添加注释之外还有更多工作要做吗?如果没有,我该怎么办呢?
答案 0 :(得分:2)
好像@Fetch
似乎不能与JPA合作?相反,修改我的存储库以包含JOIN FETCH
的显式查询似乎完成了这项工作:
@Query("SELECT step FROM StepInProcess step JOIN FETCH step.timeRange WHERE step.projectId = :projectId")
fun findAllByProjectId(projectId: UUID): List<StepInProcess>
不确定这是不是最好的路线。