【发布时间】:2017-05-23 18:02:59
【问题描述】:
我想创建一个从多个实体查询数据的“通用”存储库。如果我这样做:
@Repository
public interface MyRepository {
@Query("select r from Role r")
List<Role> getRoles();
}
我收到一个错误,因为当需要 MyRepository 实例时,Spring 找不到要注入的实现。到目前为止,一切都很好。现在,如果我这样做:
@Repository
public interface MyRepository extends JpaRepository {
@Query("select r from Role r")
List<Role> getRoles();
}
我收到一个错误,因为 Object 不是 JPA 托管类型(JpaRepository 是通用的)。好的,再次。如果我这样做:
@Repository
public interface MyRepository extends JpaRepository<User, String> {
@Query("select r from Role r")
List<Role> getRoles();
}
它有效。为什么?我为实体用户声明了一个 JpaRepository,而不是角色。为什么 JpaRepository 需要一个具体实体,即使查询将针对另一个实体?
【问题讨论】:
-
因为它还定义了其他方法,例如
findAll、findOne等,在这种情况下,这些方法仅适用于User。当您使用@Query指定方法时,它会查看方法签名。 -
即使我只想使用@Query 进行查询,是否也必须扩展 JpaRepository?
-
为什么你甚至需要一个查询呢?只需创建一个
RoleRepository extends JpaRepository<Role, Long>并使用findAll方法。但理论上你可以扩展Repository而不是JpaRepository但是你为什么要使用Spring Data JPA?你失去了所有的好处。
标签: spring spring-data spring-data-jpa