Spring Data JPA中的getOne,findOne以及findById

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

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

我们今天聊一下 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


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

查看所有标签

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

数据驱动设计

数据驱动设计

[美]罗谢尔·肯(RochelleKing)、[美]伊丽莎白F.邱吉尔(Elizabeth F Churchill)、Caitlin Tan / 傅婕 / 机械工业出版社 / 2018-8 / 69.00元

本书旨在帮你了解数据引导设计的基本原则,了解数据与设计流程整合的价值,避免常见的陷阱与误区。本书重点关注定量实验与A/B测试,因为我们发现,数据分析与设计实践在此鲜有交集,但相对的潜在价值与机会缺大。本书提供了一些关于在组织中开展数据实践的观点。通过阅读这本书,你将转变你的团队的工作方式,从数据中获得大收益。后希望你可以在衡量指标的选择、佳展示方式与展示时机、测试以及设计意图增强方面,自信地表达自......一起来看看 《数据驱动设计》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器