SpringData JPA 接口和方法

1. CrudRepository接口
其中T是要操作的实体类,ID是实体类主键的类型。该接口提供了11个常用操作方法。
@NoRepositoryBean publicinterface CrudRepository<T, ID extendsSerializable> extends Repository<T, ID> { <S extends T> S save(S entity);//保存 <S extends T> Iterable<S> save(Iterable<S> entities);//批量保存 T findOne(ID id);//根据id 查询一个对象。返回对象本身,当对象不存在时,返回null Iterable<T> findAll();//查询所有的对象 Iterable<T> findAll(Iterable<ID> ids);//根据id列表查询所有的对象 boolean exists(ID id);//根据id 判断对象是否存在 long count();//计算对象的总个数 void delete(ID id);//根据id 删除 void delete(T entity);//删除一个对象 void delete(Iterable<? extendsT> entities);//批量删除,集合对象(后台执行时,一条一条删除) void deleteAll();//删除所有(后台执行时,一条一条删除) }
2 PagingAndSortingRepository接口
该接口继承CrudRepository接口,提供了两个方法,实现了分页和排序的功能。
@NoRepositoryBean public interface PagingAndSortingRepository<T, ID extends Serializable> extendsCrudRepository<T, ID> { Iterable<T> findAll(Sort sort);// 仅排序 Page<T>findAll(Pageable pageable);// 分页和排序 }
3 JpaRepository接口
该接口继承PagingAndSortingRepository接口。同时也继承QueryByExampleExecutor接口
@NoRepositoryBean publicinterface JpaRepository<T, ID extendsSerializable> extends PagingAndSortingRepository<T, ID>,QueryByExampleExecutor<T> { List<T> findAll(); //查询所有对象,返回List List<T> findAll(Sort sort); //查询所有对象,并排序,返回List List<T> findAll(Iterable<ID> ids); //根据id列表查询所有的对象,返回List void flush(); //强制缓存与数据库同步 <S extends T> List<S> save(Iterable<S> entities); //批量保存,并返回对象List <S extends T> S saveAndFlush(S entity);//保存并强制同步数据库 void deleteInBatch(Iterable<T> entities);//批量删除集合对象(后台执行时,生成一条语句执行,用多个or条件) void deleteAllInBatch();//删除所有(执行一条语句,如:delete from user) T getOne(ID id); //根据id 查询一个对象,返回对象的引用(区别于findOne)。当对象不存时,返回引用不是null,但各个属性值是null @Override <S extends T> List<S> findAll(Example<S> example); //根据实例查询 @Override <S extends T> List<S> findAll(Example<S> example, Sort sort);//根据实例查询,并排序。 }
几点说明:
(1)几个查询、及批量保存方法,和 CrudRepository 接口相比,返回的是 List,使用起来更方便。
(2)增加了InBatch 删除,实际执行时,后台生成一条sql语句,效率更高些。相比较而言,CrudRepository 接口的删除方法,都是一条一条删除的,即便是 deleteAll 也是一条一条删除的。
(3)增加了 getOne()方法,切记,该方法返回的是对象引用,当查询的对象不存在时,它的值不是Null。
4 JpaSpecificationExecutor接口
该接口提供了对JPA Criteria查询(动态查询)的支持。

解析方法名
1.4 规则描述
按照Spring data定义的规则,查询方法以find|read|get开头(比如 find、findBy、read、readBy、get、getBy),涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性首字母需大写。框架在进行方法名解析时,会先把方法名多余的前缀截取掉,然后对剩下部分进行解析。
如果方法的最后一个参数是 Sort 或者 Pageable 类型,也会提取相关的信息,以便按规则进行排序或者分页查询。
举例说明
比如 findByUserAddressZip()。框架在解析该方法时,首先剔除findBy,然后对剩下的属性进行解析,详细规则如下(此处假设该方法针对的域对象为AccountInfo类型):
1. 先判断userAddressZip (根据 POJO 规范,首字母变为小写,下同)是否为AccountInfo 的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;
2. 从右往左截取第一个大写字母开头的字符串(此处为 Zip),然后检查剩下的字符串是否为AccountInfo的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设user 为AccountInfo 的一个属性;
3. 接着处理剩下部分(AddressZip ),先判断 user 所对应的类型是否有addressZip 属性,如果有,则表示该方法最终是根据 " AccountInfo.user.addressZip" 的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终表示根据 " AccountInfo.user.address.zip" 的值进行查询。
可能会存在一种特殊情况,比如 AccountInfo包含一个 user 的属性,也有一个 userAddress 属性,此时会存在混淆。读者可以明确在属性之间加上 "_" 以显式表达意图,比如 "findByUser_AddressZip()" 或者"findByUserAddress_Zip()"。(强烈建议:无论是否存在混淆,都要在不同类层级之间加上"_" ,增加代码可读性)
浙公网安备 33010602011771号