SpringDataJPA/Hibernate:在同一个表中使用JOIN列时如何避免不必要的JOIN
让我们假设以下关联:SpringDataJPA/Hibernate:在同一个表中使用JOIN列时如何避免不必要的JOIN,hibernate,join,spring-data-jpa,Hibernate,Join,Spring Data Jpa,让我们假设以下关联: @JoinColumn( name = "contract_id", nullable = false, foreignKey = ForeignKey(name = "fk_example__contract"), ) val contract: Contract, 在名为示例的实体中 fun findAllByContractId(contractId: Long, pageable: Pa
@JoinColumn(
name = "contract_id", nullable = false,
foreignKey = ForeignKey(name = "fk_example__contract"),
)
val contract: Contract,
在名为示例的实体中
fun findAllByContractId(contractId: Long, pageable: Pageable): Page<ExampleProjection>
如果我查询contract.id,Spring数据JPA和Hibernate将创建到表contract的联接,即使列contract\u id在同一个表中example
fun findAllByContractId(contractId: Long, pageable: Pageable): Page<ExampleProjection>
添加此附加映射后,当使用findallbycontract
这个解决方案在我的测试用例中有一个缺点:在用repsitory.getOne(id)(Spring数据JPA)加载实体之后,实体示例中的construcd
属性为null
如果我只需要在where子句中使用一个投影,或者如果contract\u id
在同一个表example
中,如果contract\u id
,有没有更好的方法来避免连接?您定义它的方式应该很好
可能是您如何使用repository.getOne()加载数据的问题。你在测试中使用它吗?也许您需要调用testEntityManager.clear()
,以便Hibernate可以正确地将id列映射到您的实体属性,即您如何定义它的列
可能是您如何使用repository.getOne()加载数据的问题。你在测试中使用它吗?也许您需要调用testEntityManager.clear()
以便Hibernate可以正确地将id列映射到您的实体属性您可以尝试findAllByContract
而不是findAllByContractId
,看看这是否有帮助。您还可以尝试示例
搜索,看看这是否有帮助。最后,如果什么也做不到,那么您可以创建一个@Query
方法。当然,对于@Query(native=true)中的本机查询,我们可以解决它,但是对于JPQL查询,我们也有同样的效果。许多是默认的fetch类型,我们(几乎)从不使用fetchType=EAGER。我认为这是反模式。默认的fetchtype为LAZY,然后使用EntityGraph加载,或者在需要时加入FETCH。否则,如果不需要,您将失去不加载内容的灵活性。我使用fetch类型LAZY和findByContract进行了尝试,效果很好。您可以尝试findAllByContract
而不是findallbycontracid
,看看这是否有帮助。您还可以尝试示例
搜索,看看这是否有帮助。最后,如果什么也做不到,那么您可以创建一个@Query
方法。当然,对于@Query(native=true)中的本机查询,我们可以解决它,但是对于JPQL查询,我们也有同样的效果。许多是默认的fetch类型,我们(几乎)从不使用fetchType=EAGER。我认为这是反模式。默认的fetchtype为LAZY,然后使用EntityGraph加载,或者在需要时加入FETCH。否则,如果不需要,您将失去不加载东西的灵活性。