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 使用起来还是比较简单的。