Spring Data JPA 中 findById、getOne、findOne 的区别

转载文献: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。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值