自己做网站外包,长沙智能建站模板,湖南做网站 找磐石网络一流,广告设计软件下载EntityManager 介绍
我们前面已经无数次提到了#xff0c;JPA 的默认 Repository 的实现类是 SimpleJpaRepository#xff0c;而里面的具体实现就是调用的 EntityManager。对于 javax.persistence.EntityManager 通过源码#xff0c;先来看下它主要给我们提供了哪几个方法JPA 的默认 Repository 的实现类是 SimpleJpaRepository而里面的具体实现就是调用的 EntityManager。对于 javax.persistence.EntityManager 通过源码先来看下它主要给我们提供了哪几个方法
public interface EntityManager {/***根据主键查询实体对象*/public T T find(ClassT 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 TypedQueryT createQuery(CriteriaQueryT 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.LocalContainerEntityManagerFactoryBean2dac78aa] 动态代理管理而动态代理的实现类就是 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(JpaEntityInformationT, ? 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));
//得到最终的返回结果
ListReportSpuSummarySumBo results query.getResultList();
此案例仅仅为了说明 entityManager.createNativeQuery 的查询方法但是不推荐用这种用法开发思路可转换一下做到心中有数即可。
案例2find 方法
entityManager.find(UserInfoEntity.class,1);
案例3JPQL 的用法
Query query entityManager.createQuery(SELECT c FROM Customer c);
ListCustomer result query.getResultList();
EntityManager 使用起来还是比较简单的。