一、JPA提供的接口
- Repository: 最顶层的接口,是一个空接口,目的是为了统一所有的Repository的类型,且能让组件扫描时自动识别
- CrudRepository: Repository的子接口,提供CRUD 的功能。
- PagingAndSortingRepository:CrudRepository的子接口, 添加分页排序。
- JpaRepository: PagingAndSortingRepository的子接口,增加批量操作等。
- JpaSpecificationExecutor: 用来做复杂查询的接口。
- JpaRepositoryImplementation:继承了JpaSpecificationExecutor和JpaRepository,做所有的CRUD,如果想要使用JPQL和Criteria两种查询,建议继承此接口
-
Repository
最顶层的接口,是一个空的接口,目的是为了统一所有Repository的类型,且能让组件扫描的时候自动识别。
-
CrudRepository
是Repository的子接口,提供基础的CRUD的功能。
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
<S extends T> S save(S entity); //保存
<S extends T> Iterable<S> saveAll(Iterable<S> entities);//批量保存
Optional<T> findById(ID id); //按ID查询
boolean existsById(ID id);//查询ID是否存在
Iterable<T> findAll();//查询所有
Iterable<T> findAllById(Iterable<ID> ids);//查询所有ID相同的
long count();//计算条数
void deleteById(ID id);//按ID删除
void delete(T entity);//按实体类条件删除
void deleteAll(Iterable<? extends T> entities);//按实体类 删除全部数据
void deleteAll();//删除所有数据
}
-
PagingAndSortingRepository
是CrudRepository的子接口,添加分页和排序的功能
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort sort);//排序
Page<T> findAll(Pageable pageable);//分页
}
- JpaRepository(常用)(重要,一般直接继承此接口)
是PagingAndSortingRepository的子接口,增加了一些实用的功能,比如:批量操作等。
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
List<T> findAll();
List<T> findAll(Sort sort);
List<T> findAllById(Iterable<ID> ids);
<S extends T> List<S> saveAll(Iterable<S> entities);
void flush();
<S extends T> S saveAndFlush(S entity);
void deleteInBatch(Iterable<T> entities);
void deleteAllInBatch();
T getOne(ID id);
@Override
<S extends T> List<S> findAll(Example<S> example);
@Override
<S extends T> List<S> findAll(Example<S> example, Sort sort);
}
- JpaSpecificationExecutor(常用):用来做负责查询的接口,使用到criteria查询需要继承此接口
public interface JpaSpecificationExecutor<T> {
Optional<T> findOne(@Nullable Specification<T> spec);
List<T> findAll(@Nullable Specification<T> spec);
Page<T> findAll(@Nullable Specification<T> spec, Pageable pageable);
List<T> findAll(@Nullable Specification<T> spec, Sort sort);
long count(@Nullable Specification<T> spec);
}
-
JpaRepositoryImplementation(最佳版本):继承了JpaSpecificationExecutor和JpaRepository,做所有的CRUD,如果想要使用JPQL和Criteria两种查询,建议继承此接口
-
SimpleJpaRepository:是上面接口的实现类,负责规范化查询语句,里面有EntityManager
- QuerydslJpaRepository:上面的子类,负责处理@Query的语句,里面有EntityManager
-
二、JPA自带的方法
- 直接继承接口JpaRepository即可
public interface UserDao extends JpaRepository<对应的Entity类, 该类的主键类型>{
...}
- 接口里自带的所有增删改查方法
<S extends T> S save(S entity);
<S extends T> Iterable<S> saveAll(Iterable<S> entities);
Optional<T> findById(ID id);
boolean existsById(ID id);
Iterable<T> findAll();
Iterable<T> findAllById(Iterable<ID> ids);
long count();
void deleteById(ID id);
void delete(T entity);
void deleteAll(Iterable<? extends T> entities);
void deleteAll();
Iterable<T> findAll(Sort sort);
Page<T> findAll(Pageable pageable);
List<T> findAll();
List<T> findAll(Sort sort);
List<T> findAllById(Iterable<ID> ids);
<S extends T> List<S> saveAll(Iterable<S> entities);
void flush();
<S extends T> S saveAndFlush(S entity);
void deleteInBatch(Iterable<T> entities);
void deleteAllInBatch();
T getOne(ID id);
<S extends T> List<S> findAll(Example<S> example);
<S extends T> List<S> findAll(Example<S> example, Sort sort);
三、标准查询(重要)
- 继承接口JpaRepository<对应的Entity类, 该类的主键类型>
public interface UserRepository extends JpaRepository<User, Long>{
...}
- 基础的增删上面继承接口后已经全部实现了,需要自定义的部分只有查询
- 查询方法需要按照语法规范书写,规范下面表格已详细给出,这里举一个例子
public interface UserRepository extends JpaRepository<User, Long>{
//按照用户名模糊查询,username是User类的一个字段
findByUsernameLike(String username);
}
标准化查询对应的JPQL语法
Keyword | Sample | JPQL snippet |
---|---|---|
And | findByLastnameAndFirstname | … where x.lastname = ?1 and x.firstname = ?2 |
Or | findByLastnameOrFirstname | … where x.lastname = ?1 or x.firstname = ?2 |
Is,Equals | findByFirstname,findByFirstnameIs,findByFirstnameEquals | … where x.firstname = ?1 |
Between | findByStartDateBetween | … where x.startDate between ?1 and |