Fork me on GitHub
余鸢

使用spring data jpa

安装或设置

要开始使用Spring data JPA,必须在项目中包含与Spring核心之一的依赖关系。 如果你使用Maven作为依赖关系管理系统(用要使用的版本替换版本号):

1
2
3
4
5
6
7
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>version-number</version>
</dependency>
</dependencies>

如果你使用Gradle:

1
2
3
dependencies {
compile 'org.springframework.data:spring-data-jpa:version-number'
}

你也可以使用Spring Boot时设置它,只是包括启动器依赖和摆脱的版本号:

1
2
3
4
5
6
dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>

创建JPA管理的存储库

实体类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Entity
@Table(name = "USER")
public class User implements {
@Id
@Column(name = "ID")
private Long id;
@Column(name = "USERNAME")
private String username;
@ManyToOne
@JoinColumn("ORGANIZATION_ID")
private Organization organization;
}

Repository interface:

1
2
3
4
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
public User findByUsername(String username);
}

接口中的方法声明将生成以下jpql查询:

1
select u from User u where u.username = :username

或者我们可以定义一个自定义查询:

1
2
@Query("select u from User u where u.username = :username")
public User findByUsername(@Param("username") String username)

也可以很容易地添加排序到方法声明:

1
2
3
public interface UserRepository extends PagingAndSortingRepository<User, Long> {
public User findByUsernameOrderByUsernameAsc(String username);
}

也可以使用内置的分页支持:

1
public Page<User> findByOrganizationPaged(Organization organization, Pageable pageable);

服务层(或调用此方法的人)将向该方法传递PageRequest:

1
2
3
4
public Page<User> getByOrganizationPagedOrderByUsername(Organization organization, int page, int size, String direction){
return userRepository.findByOrganizationPaged(organization, new PageRequest(page, size, Direction.valueOf(direction),
"username")
}

通过标识符查找实体类的特定实例

可以如下加载实体类的特定实例:

1
Foo foo = fooRepository.findOne(id);

findOne方法由CrudRepository接口提供。 它期望唯一标识实体实例的标识符(例如,数据库表中的主键)。 id参数的Java类型必须与分配给使用JPA @Id注释的实体属性类型相匹配。

调用findOne方法使 JPA queryselect foo from Foo foo where foo.[primary-key-column] = :id

正在基础数据库上执行。

查找实体类的所有实例

可以从底层数据库表中加载实体类的所有实例(对象),如下所示(类似于从表中检索所有行):

1
Iterable<Foo> foos = fooRepository.findAll();

findAll方法由CrudRepository接口提供。 它返回一个Iterable而不是像ListSet这样更具体的类型,因为 some implementations of the interface may be unable to return a Collection type(接口的某些实现可能无法返回Collection类型),因此对返回的值使用Collection类型将导致它们失去功能。

调用findAll方法使 JPA query select foo from Foo foo正在底层数据库上执行。

查找具有与指定值匹配属性的实体类的所有实例

可以检索具有与指定值匹配的类属性之一的实体类的所有实例,如下所示:

1
2
3
public interface FooRepository extends CrudRepository<Foo, Long> {
List<Foo> findAllByName(String name);
}

调用findAllByName方法使 JPA query select foo from Foo foo where foo.name = :name将在底层数据库上执行。

注意事项:

  1. name必须是Foo实体类上的一个属性。
  2. 方法名称必须以findgetread开头。 像其他关键字比如select不会工作。
  3. 不保证结果返回的顺序。

备注:

Spring Data项目允许应用程序员使用一个称为Repository的抽象的一致接口来处理数据存储。 Spring Data Repository是在域驱动设计流行的存储库模式之后建模的。 Spring Data提供了名为Repository的中央Java接口,子项目可以扩展以提供特定于数据存储的功能。

除了Repository接口,Spring Data还提供了两个核心接口 - CrudRepository,用于定义基本CRUD(create, read, updatedelete)功能的合同; 和PagingAndSortingRepository,它通过定义分页和排序的合同来扩展CrudRepository

这三个核心接口(RepositoryCrudRepositoryPagingAndSortingRepository)确保:

  1. 应用程序员可以以一致的方式访问数据存储(例如关系数据库,基于文档的NoSQL数据库,图形数据库等)。
  2. 可以很容易地为域实体切换底层存储(请参阅域驱动设计),而不必更改应用程序与数据存储交互的方式。
  3. 特定实现可以提供特定于数据存储的特征。