EntityManager 介绍

我们前面已经无数次提到了,JPA 的默认 Repository 的实现类是 SimpleJpaRepository,而里面的具体实现就是调用的 EntityManager。对于 javax.persistence.EntityManager 通过源码,先来看下它主要给我们提供了哪几个方法:

public interface EntityManager {/***根据主键查询实体对象*/public <T> T find(Class<T> entityClass, Object primaryKey);/***  支持JQPL的语法* @param qlString a Java Persistence query string*/public Query createQuery(String qlString);/*** 利用CriteriaQuery来创建查询* @param criteriaQuery  a criteria query object*/public <T> TypedQuery<T> createQuery(CriteriaQuery<T> criteriaQuery);/*** 利用CriteriaUpdate创建更新查询* @param updateQuery a criteria update query object*/public Query createQuery(CriteriaUpdate updateQuery);/*** 利用CriteriaDelete创建删除查询* @param deleteQuery a criteria delete query object*/public Query createQuery(CriteriaDelete deleteQuery);/*** 利用原生的sql语句创建查询,可以是查询、更新、删除等sql* @param sqlString a native SQL query string*/public Query createNativeQuery(String sqlString);/*** 利用原生SQL查询,指定返回结果类型* @param sqlString a native SQL query string* @param resultClass the class of the resulting instance(s)*/public Query createNativeQuery(String sqlString, Class resultClass);
......
}

而 javax.persistence.EntityManager 就是 Java Persitence API 的核心操作方法了,我们可以在 SimpleJpaRepository 的构造方法上面设置一断点,如下位置,就可以发现 entityManager 是由 [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@2dac78aa] 动态代理管理,而动态代理的实现类就是 org.hibernate.internal.SessionImpl,这就是 Spring Data JPA 的核心封装和实现了(如果是从 Hibernate 切换过来的,这部分内容就不陌生了)。

    /*** Creates a new {@link SimpleJpaRepository} to manage objects of the given {@link JpaEntityInformation}.** @param entityInformation must not be {@literal null}.* @param entityManager must not be {@literal null}.*/public SimpleJpaRepository(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {Assert.notNull(entityInformation, "JpaEntityInformation must not be null!");Assert.notNull(entityManager, "EntityManager must not be null!");this.entityInformation = entityInformation;this.em = entityManager;this.provider = PersistenceProvider.fromEntityManager(entityManager);}

EntityManager 的简单使用案例

案例1:针对复杂的原生 SQL 的查询

//创建sql语句
StringBuilder querySQL = new StringBuilder("SELECT spu_id AS spuId ,spu_name AS spuName,").append("SUM(system_price_count) AS systemPriceCount,").append("SUM(wechat_applet_view_count) AS wechatAppletViewCount").append(" FROM report_spu_summary ");
//利用entityManager实现查询
Query query = entityManager.createNativeQuery(querySQL.toString() + whereSQL.toString() + groupBy + orderBy.toString());
//分页
query.setFirstResult(custom.offset()).setMaxResults(custom.getPageSize());
//结果转换
query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(ReportSpuSummarySumBo.class));
//得到最终的返回结果
List<ReportSpuSummarySumBo> results = query.getResultList();

此案例仅仅为了说明 entityManager.createNativeQuery 的查询方法,但是不推荐用这种用法,开发思路可转换一下,做到心中有数即可。

案例2:find 方法

entityManager.find(UserInfoEntity.class,1);

案例3:JPQL 的用法

Query query = entityManager.createQuery("SELECT c FROM Customer c");
List<Customer> result = query.getResultList();  

EntityManager 使用起来还是比较简单的。

Spring Data JPA 从入门到精通~EntityManager介绍相关推荐

  1. Spring Data JPA 从入门到精通~JpaRepository介绍

    从 JpaRepository 开始的子类,都是 Spring Data 项目对 JPA 实现的封装与扩展.JpaRepository 本身继承 PagingAndSortingRepository ...

  2. Spring Data JPA 从入门到精通~@Version处理乐观锁的问题

    @Version 处理乐观锁的问题 @Version 乐观锁介绍 我们在研究 Auditing 的时候,发现了一个有趣的注解 @Version,源码如下: package org.springfram ...

  3. spring data jpa从入门到精通_Spring Data JPA的简单入门

    前言 spring data JPA是spring团队打造的sping生态全家桶的一部分,本身内核使用的是hibernate核心源码,用来作为了解java持久层框架基本构成的样本是再好不过的选择.最近 ...

  4. Spring Data JPA 从入门到精通~默认数据源的讲解

    默认数据源 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://1 ...

  5. Spring Data JPA 从入门到精通~实际工作的应用场景

    在实际工作中,有哪些场景会用到自定义 Repository 呢,这里列出几种实际在工作中的应用案例. 1. 逻辑删除场景 可以用到上面说的两种实现方式,如果有框架级别的全局自定义 Respositor ...

  6. Spring Data JPA 从入门到精通~自定义实现Repository

    EntityManager 的获取方式 我们既然要自定义,首先讲一下 EntityManager 的两种获取方式. 1. 通过 @PersistenceContext 注解. 通过将 @Persist ...

  7. Spring Data JPA 从入门到精通~JpaSpecificationExecutor示例

    新建两个实体 @Entity(name = "UserInfoEntity") @Table(name = "user_info", schema = &quo ...

  8. Spring Data JPA 从入门到精通~JpaSpecificationExecutor的使用方法

    JpaSpecificationExecutor 源码和 API 我们也可以通过 idea 工具详细看其用法和实现类,JpaSpecificationExecutor 是 Repository 要继承 ...

  9. Spring Data JPA 从入门到精通~QueryByExampleExecutor的使用

    QueryByExampleExecutor 的使用 按示例查询(QBE)是一种用户友好的查询技术,具有简单的接口,它允许动态查询创建,并且不需要编写包含字段名称的查询.从 UML 图中,可以看出继承 ...

最新文章

  1. 爬虫之requests模块介绍
  2. 03-spring bean
  3. .net core 微服务之API网关 开源中间件 Ocelot 笔记
  4. hive中如何把13位转化为时间_重要知识点收藏 | Hive常用函数大全
  5. 饿了么前端DEMO 网址 VUE.js
  6. json pandas 内存溢出_pandas中的常用函数
  7. Source Xref 与 JavaDocs 学习理解
  8. 计算机毕业设计asp.net企业差旅管理系统(源码+系统+mysql数据库+Lw文档)
  9. mac10.15切换大小写指示灯不亮
  10. 移动APP开发框架盘点
  11. matlab电磁铁磁场,Matlab在电磁铁设计计算中的应用
  12. linux命令 mml,微软开源用于Spark的深度学习库MMLSpark
  13. 一个项目的经验教训:关于打乱和拆分数据
  14. python为什么胶水语言_Python真的什么都可以做,胶水语言可不是白叫的
  15. SSH git初次克隆代码问题报错 fatal: unable to update url base from redirection:
  16. 通信原理仿真100例 | 多普勒频移的matlab仿真
  17. 9.9实例操作:MVC设计模式应用遇到的问题和解决办法
  18. conda env create -f conda.yml出错
  19. 【区块链学习最全教程】学习 Solidity,全栈 Web3,Javascript 和区块链开发
  20. FIFO专题之单口RAM实现FIFO(同步)

热门文章

  1. 论文浅尝 | 利用开放域触发器知识改进事件检测
  2. 论文浅尝 | 面向 cQA 的跨语言问题检索方法
  3. 论文浅尝 | Understanding Black-box Predictions via Influence Func
  4. 行业新闻 | 阿里发力知识图谱研究 悉数囊括顶尖学者探讨合作
  5. 【TensorFlow】优化方法optimizer总结(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)解析(十三)
  6. RabbitMQ 简介和使用
  7. 时间约束的实体解析中记录对排序研究
  8. 面向区块链的高效物化视图维护和可信查询
  9. 委托、Lambda表达式、事件系列07,使用EventHandler委托
  10. Laravel 代码开发最佳实践(持续更新)