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。否则,如果不需要,您将失去不加载东西的灵活性。