【问题标题】:Which Spring Data repository to choose when you use an INNER JOIN or return attributes from several entities?使用 INNER JOIN 或从多个实体返回属性时选择哪个 Spring Data 存储库?
【发布时间】:2021-04-13 20:40:57
【问题描述】:

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

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);
}

【问题讨论】:

  • 我会创建一个Repository,充当它们之间的中间层,也许可以称之为UserAddressRepo

标签: spring-data-jpa inner-join spring-repositories


【解决方案1】:

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

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

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

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

【讨论】:

  • 好的,明白了,我在上面的例子中考虑过,但是像下一个一样做了一些修改 @Query("select a.zipCode from User u JOIN u.address a where u.emailAddress = :emailAddress ") String findZipCodeByEmailAddress(String emailAddress);
猜你喜欢
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 2020-09-21
  • 2012-08-10
  • 1970-01-01
  • 2016-07-06
  • 2018-10-11
相关资源
最近更新 更多