Spring Data JPA中findOne()和getOne()用法

 更新时间:2023年11月30日 15:08:41   作者:闫二白  
这篇文章主要介绍了Spring Data JPA中findOne()和getOne()的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

引言

最近在使用SpringDataJPA做CRUD功能,在做到需要查询单个的功能的时候,

我们发现SpringDataJPA为我们提供了两种办法findOne() 和 getOne(),

那我们该如何选择呢,他们之间的区别又是什么呢,下面我们来总结一下。

findOne() 和 getOne()的区别

首先我们看一下Spring官方对他们的解释

/**   
 *    Retrieves an entity by its id.
 *    @param id must not be {@literal null}.
 *    @return the entity with the given id or {@literal null} if none found
 *    @throws IllegalArgumentException if {@code id} is {@literal null}
  * /

      T findOne(ID id);
/**
 *  Returns a reference to the entity with the given identifier.
 * 
 *  @param id must not be {@literal null}.
 *  @return a reference to the entity with the given identifier.
 *  @see EntityManager#getReference(Class, Object)
 */
  
    T getOne(ID id);

findOne:当我查询一个不存在的id数据时,返回的值是null.


在这里插入图片描述
 

getOne: return 对具有给定标识符的实体的引用。

当我查询一个不存在的id数据时,直接抛出异常,因为它返回的是一个引用,简单点说就是一个代理对象。


在这里插入图片描述

我们知道SpringDataJPA底层默认使用Hibernate,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;

而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

所以我们可以吧findOne() 当成hibernate中get方法,getOne()当成hibernate中load方法来记忆。。。。。

补充

以前我们使用Spring Data Jpa 的查询单个的时候,可以使用findOne()方法根据id查询。

但是在2.0.5以后,不能用来当作根据id查询了。2.0.5以后变成了findById(id).get()来查询了。

2.0.5版本以前的CrudRepository类是这样的:

@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
    <S extends T> S save(S var1);

    <S extends T> Iterable<S> save(Iterable<S> var1);

    T findOne(ID var1);

    boolean exists(ID var1);

    Iterable<T> findAll();

    Iterable<T> findAll(Iterable<ID> var1);

    long count();

    void delete(ID var1);

    void delete(T var1);

    void delete(Iterable<? extends T> var1);

    void deleteAll();
}

2.0.5版本以后的CrudRepository类是这样的:

@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
    <S extends T> S save(S var1);

    <S extends T> Iterable<S> saveAll(Iterable<S> var1);

    Optional<T> findById(ID var1);

    boolean existsById(ID var1);

    Iterable<T> findAll();

    Iterable<T> findAllById(Iterable<ID> var1);

    long count();

    void deleteById(ID var1);

    void delete(T var1);

    void deleteAll(Iterable<? extends T> var1);

    void deleteAll();
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java classloader类加载器的实现

    Java classloader类加载器的实现

    本文介绍了Java类加载器的继承性和隔离性,类加载器分为四个层级:Bootstrap、Extension、System和Plugin,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-12-12
  • Java 单元测试之Mockito 模拟静态方法与私有方法最佳实践

    Java 单元测试之Mockito 模拟静态方法与私有方法最佳实践

    本文将深入探讨如何使用 Mockito 来模拟静态方法和私有方法,结合大量实战代码示例,带你突破传统单元测试的边界,写出更彻底、更独立、更具可读性的测试用例,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • Restful API中的错误处理方法

    Restful API中的错误处理方法

    这篇文章主要给大家介绍了关于Restful API中错误处理方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • spring boot补习系列之几种scope详解

    spring boot补习系列之几种scope详解

    这篇文章主要给大家介绍了关于spring boot补习系列之几种scope的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • 解决maven父子工程install的时候排除某些子模块,让子模块不install问题

    解决maven父子工程install的时候排除某些子模块,让子模块不install问题

    在Maven父子工程中,如果希望某个子模块不被安装到本地仓库,可以在该子模块的`pom.xml`文件中添加以下配置: ```xml ... org.apache.maven.plugins maven-install-plugin 2.5.2 true
    2024-12-12
  • SpringBoot yaml语法与JRS303校验超详细讲解

    SpringBoot yaml语法与JRS303校验超详细讲解

    YAML 是 “YAML Ain’t Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • MyBatis通用Mapper实现原理及相关内容

    MyBatis通用Mapper实现原理及相关内容

    今天小编就为大家分享一篇关于MyBatis通用Mapper实现原理及相关内容,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Spring中的BeanFactory与FactoryBean区别详解

    Spring中的BeanFactory与FactoryBean区别详解

    这篇文章主要介绍了Spring中的BeanFactory与FactoryBean区别详解,BeanFactory是一个接口,它是spring中的一个工厂,FactoryBean也是一个接口,实现了3个方法,通过重写其中方法自定义生成bean,需要的朋友可以参考下
    2024-01-01
  • SpringBoot+Maven 多模块项目的构建、运行、打包实战

    SpringBoot+Maven 多模块项目的构建、运行、打包实战

    这篇文章主要介绍了SpringBoot+Maven 多模块项目的构建、运行、打包实战,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Spark集群框架的搭建与入门

    Spark集群框架的搭建与入门

    Spark是专为大规模数据处理而设计的,基于内存快速通用,可扩展的集群计算引擎,实现了高效的DAG执行引擎,可以通过基于内存来高效处理数据流,运算速度相比于MapReduce得到了显著的提高。
    2021-06-06

最新评论