了解Spring Data中的存储库

时间:2017-01-09 12:59:55

标签: spring spring-data spring-data-jpa

我想创建一个"泛型"查询来自多个实体的数据的存储库。如果我这样做:

@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需要一个具体的实体,即使查询将针对另一个实体?

1 个答案:

答案 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>只是滥用框架。