Spring Data JPA中的getOne,findOne以及findById

栏目: Java · 发布时间: 6年前

内容简介:我们今天聊一下咋一看三个方法都能返回一个结果集,用哪个好像都没问题。我当初也是这么想的,后来在写作业的过程中出错了,真相只有一个。我的例子是查询一个一对一映射关系的实体,极为简单,我就不上代码了;用

我们今天聊一下 Spring Data JPA 里的三个方法,分别是 getOnefindOne 以及 findById

咋一看三个方法都能返回一个结果集,用哪个好像都没问题。我当初也是这么想的,后来在写作业的过程中出错了,真相只有一个。

我的例子是查询一个一对一映射关系的实体,极为简单,我就不上代码了;用 findById 则可以实现我们的需求,而使用 getOne 查询后对结果集进行打印,出现下面的异常。

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

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

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

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

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

Spring Data JPA中的getOne,findOne以及findById

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

Spring Data JPA中的getOne,findOne以及findById

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

Spring Data JPA中的getOne,findOne以及findById

那他们的区别也就是:

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

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Cyberwar

Cyberwar

Kathleen Hall Jamieson / Oxford University Press / 2018-10-3 / USD 16.96

The question of how Donald Trump won the 2016 election looms over his presidency. In particular, were the 78,000 voters who gave him an Electoral College victory affected by the Russian trolls and hac......一起来看看 《Cyberwar》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具