转载文献:Spring Data JPA 中 findById、getOne、findOne 的区别
1、findById 方法
Optional<T> findById(ID id);
findById 方法会立即(EAGER)访问数据库,并返回和指定 ID 关联的实体对象;如果没有找到,则返回 Optional.empty()。
2、getOne 方法
T getOne(ID id);
getOne 是一个延迟加载方法,它并不是立即访问数据库,而是返回一个代理(proxy)对象,这个代理对象是对实体对象的引用,仅在 使用代理对象访问对象属性时才会去真正访问数据库 ;如果找不到,则抛出 EntityNotFoundException。
3、findOne 方法
<S extends T> Optional<S> findOne(Example<S> example);
Optional<T> findOne(@Nullable Specification<T> spec);
这两个方法用于需要动态构建多条件查询的场景中,它们都是立即访问数据库的。
返回类型为 Optional ,如果没有检索到,返回 Optional.empty(),结果满足条件的记录条数超过一条,则抛出 IncorrectResultSizeDataAccessException
4、总结
1、getOne 是延迟加载;而 findById、findOne 是立即加载。
2、 getOne 如果找不到记录会抛出EntityNotFoundException;而 findById、findOne 会返回 Optional.empty()。
3、 在 @ManyToOne 的场景中使用 findOne ,可以获得延迟加载机制带来的性能优势。
4、 在根据非 ID 查询、或动态查询的场景中,使用 findOne。
5、 findOne 查询条件不能返回超过一条,否则会抛出 IncorrectResultSizeDataAccessException。