我想创建一个"泛型"查询来自多个实体的数据的存储库。如果我这样做:
@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();
}
有效。为什么?我为实体User声明了一个JpaRepository,而不是Role。为什么JpaRepository需要一个具体的实体,即使查询将针对另一个实体?
答案 0 :(得分:1)
Spring Data中的每个存储库都必须扩展Repository接口,这是一个通用接口,所以你总是必须指定你要使用的实体,而你却无法做任何事情,因为Spring就是这样的数据已实施。您可以在此处找到有关创建存储库的更多信息:
http://docs.spring.io/spring-data/jpa/docs/1.4.0.M1/reference/html/repositories.html
另一方面,当然你可以指定一个实体到存储库,然后添加返回其他类型实体的方法,因为在你的界面中你可以添加你想要的任何东西(也注意到Repository接口没有方法)。但是,如果要使用父接口的方法,则必须使用指定的实体。
在你的例子中,你可以做@M。 Deinum建议并创建JpaRepository<Role, Long>
并使用findAll
查询,这更有意义。正如您所做的那样使用JpaRepository<User, String>
只是滥用框架。