安装或设置
要开始使用Spring data JPA,必须在项目中包含与Spring核心之一的依赖关系。 如果你使用Maven作为依赖关系管理系统(用要使用的版本替换版本号):
|
|
如果你使用Gradle:
|
|
你也可以使用Spring Boot时设置它,只是包括启动器依赖和摆脱的版本号:
|
|
创建JPA管理的存储库
实体类:
|
|
Repository interface:
|
|
接口中的方法声明将生成以下jpql查询:
|
|
或者我们可以定义一个自定义查询:
|
|
也可以很容易地添加排序到方法声明:
|
|
也可以使用内置的分页支持:
|
|
服务层(或调用此方法的人)将向该方法传递PageRequest:
|
|
通过标识符查找实体类的特定实例
可以如下加载实体类的特定实例:
|
|
findOne
方法由CrudRepository
接口提供。 它期望唯一标识实体实例的标识符(例如,数据库表中的主键)。 id
参数的Java类型必须与分配给使用JPA @Id
注释的实体属性类型相匹配。
调用findOne
方法使 JPA query从select foo from Foo foo where foo.[primary-key-column] = :id
正在基础数据库上执行。
查找实体类的所有实例
可以从底层数据库表中加载实体类的所有实例(对象),如下所示(类似于从表中检索所有行):
|
|
findAll
方法由CrudRepository
接口提供。 它返回一个Iterable
而不是像List
或Set
这样更具体的类型,因为 some implementations of the interface may be unable to return a Collection
type(接口的某些实现可能无法返回Collection类型),因此对返回的值使用Collection类型将导致它们失去功能。
调用findAll
方法使 JPA query select foo from Foo foo
正在底层数据库上执行。
查找具有与指定值匹配属性的实体类的所有实例
可以检索具有与指定值匹配的类属性之一的实体类的所有实例,如下所示:
|
|
调用findAllByName
方法使 JPA query select foo from Foo foo where foo.name = :name
将在底层数据库上执行。
注意事项:
name
必须是Foo
实体类上的一个属性。- 方法名称必须以
find
,get
或read
开头。 像其他关键字比如select
不会工作。 - 不保证结果返回的顺序。
备注:
Spring Data项目允许应用程序员使用一个称为Repository
的抽象的一致接口来处理数据存储。 Spring Data Repository
是在域驱动设计流行的存储库模式之后建模的。 Spring Data提供了名为Repository
的中央Java接口,子项目可以扩展以提供特定于数据存储的功能。
除了Repository
接口,Spring Data还提供了两个核心接口 - CrudRepository
,用于定义基本CRUD(create, read, update 和 delete)功能的合同; 和PagingAndSortingRepository
,它通过定义分页和排序的合同来扩展CrudRepository
。
这三个核心接口(Repository
,CrudRepository
和PagingAndSortingRepository
)确保:
- 应用程序员可以以一致的方式访问数据存储(例如关系数据库,基于文档的NoSQL数据库,图形数据库等)。
- 可以很容易地为域实体切换底层存储(请参阅域驱动设计),而不必更改应用程序与数据存储交互的方式。
- 特定实现可以提供特定于数据存储的特征。