在Hibernate中的单个查询中获取相关实体

时间:2018-04-27 18:41:52

标签: hibernate jpa

我有两个看起来像这样的实体:

@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语句;不确定是否有更好的诊断方法。

或者,我可以推荐startTimeendTime作为Step本身的属性,但我也不清楚如何实现这一点。我想要在两个实体之间创建继承关系,因为说“步骤”是一个“时间范围”并不公平。

@Fetch是正确的方法吗?如果是这样,除了向该属性添加注释之外还有更多工作要做吗?如果没有,我该怎么办呢?

1 个答案:

答案 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>

不确定这是不是最好的路线。