Spring Data JPA中的getOne,findOne以及findById

咱们今天聊一下Spring Data JPA里的三个方法,分别是getOnefindOne以及findById
咋一看三个方法都能返回一个结果集,用哪一个好像都没问题。我当初也是这么想的,后来在写做业的过程当中出错了,真相只有一个。
个人例子是查询一个一对一映射关系的实体,极为简单,我就不上代码了;用findById则能够实现咱们的需求,而使用getOne查询后对结果集进行打印,出现下面的异常。spring

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

这个异常好像跟使用哪一个方法没太大的关系,由于他是在获得查询的结果集后,打印这个结果集的时候出现的,且映射关系默认使用FetchType.EAGER,实体的toString方法仅对实体本身的属性作打印,不处理映射关系,莫非是由于获得的一个代理对象,不能映射成实体?还但愿路过的高人指点一二。api

最后使用findOne,也能准确的查到结果,有趣的是打印了三条查询语句。spa

翻开官方的API,找找这几个磨人的方法都在哪:hibernate

  • getOne来自JpaReposiroty接口,对于传入的标识则返回一个实体的引用;且取决于该方法的实现,可能会出现EntityNotFoundException,并会拒绝一些无效的标识;

clipboard.png

  • findById来自CrudRepository接口,经过它的id返回一个实体;

clipboard.png

  • findOne来自QueryByExampleExecutor接口,返回一个经过Example匹配的实体或者null

clipboard.png

那他们的区别也就是:代理

  • getOne返回一个实体的引用,无结果会抛出异常;
  • findById返回一个Optional对象;
  • findOne返回一个Optional对象,能够实现动态查询;

Optional表明一个可能存在也可能不存在的值。code

注:文中使用的版本为Spring Data JPA 2.1.8.RELEASE对象

相关文章
相关标签/搜索