当您使用 INNER JOIN 或从多个实体返回属性时,要选择哪个 Spring Data 存储库?

问题描述

使用 Spring Data JPA 存储库以及使用 @Query 注释的方法(如下所示),在这种情况下,我不知道此查询是否应该在 UserRepositoryAddressRepository 中。当您想要从两个实体返回属性时,它会更加复杂。谢谢!

public interface UserRepository extends JpaRepository<User,Long> {

  @Query("select u.name from User u JOIN u.address a where u.emailAddress = :emailAddress  and a.zipcode=:zipcode")
  User findByEmailAddressAndZipCode(String emailAddress,String zipcode);
}

解决方法

它返回一个 User,因此我希望它存在于 UserRepository 中。 User 已经通过同名属性知道 Address,因此 UserRepository 也可以这样做。

User 包含对 Address 的引用这一事实与选择正确存储库无关。

如果您的查询返回的内容与 UserAddress 完全不同,例如关于每个城市的用户数量的一些统计数据,基于映射到视图的实体或独立于 Spring Data 的完整自定义实现,拥有一个单独的存储库可能是有意义的。这种实体和存储库位于不同的 Bounded Context

您应该考虑的另一个问题是您是否需要/想要 AddressRepository。我们显然几乎不知道您的域,但从我看来,Address 似乎并不独立于 User 而存在,因此应该是 User-Aggregate 的一部分并且没有它自己的存储库。 见https://stackoverflow.com/a/21277087/66686