javascript
Spring Data JPA 从入门到精通~EntityManager介绍
EntityManager 介紹
我們前面已經(jīng)無數(shù)次提到了,JPA 的默認(rèn) Repository 的實現(xiàn)類是 SimpleJpaRepository,而里面的具體實現(xiàn)就是調(diào)用的 EntityManager。對于 javax.persistence.EntityManager 通過源碼,先來看下它主要給我們提供了哪幾個方法:
public interface EntityManager {/***根據(jù)主鍵查詢實體對象*/public <T> T find(Class<T> entityClass, Object primaryKey);/*** 支持JQPL的語法* @param qlString a Java Persistence query string*/public Query createQuery(String qlString);/*** 利用CriteriaQuery來創(chuàng)建查詢* @param criteriaQuery a criteria query object*/public <T> TypedQuery<T> createQuery(CriteriaQuery<T> criteriaQuery);/*** 利用CriteriaUpdate創(chuàng)建更新查詢* @param updateQuery a criteria update query object*/public Query createQuery(CriteriaUpdate updateQuery);/*** 利用CriteriaDelete創(chuàng)建刪除查詢* @param deleteQuery a criteria delete query object*/public Query createQuery(CriteriaDelete deleteQuery);/*** 利用原生的sql語句創(chuàng)建查詢,可以是查詢、更新、刪除等sql* @param sqlString a native SQL query string*/public Query createNativeQuery(String sqlString);/*** 利用原生SQL查詢,指定返回結(jié)果類型* @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 的構(gòu)造方法上面設(shè)置一斷點,如下位置,就可以發(fā)現(xiàn) entityManager 是由 [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@2dac78aa] 動態(tài)代理管理,而動態(tài)代理的實現(xiàn)類就是 org.hibernate.internal.SessionImpl,這就是 Spring Data JPA 的核心封裝和實現(xiàn)了(如果是從 Hibernate 切換過來的,這部分內(nèi)容就不陌生了)。
/*** 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:針對復(fù)雜的原生 SQL 的查詢
//創(chuàng)建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實現(xiàn)查詢 Query query = entityManager.createNativeQuery(querySQL.toString() + whereSQL.toString() + groupBy + orderBy.toString()); //分頁 query.setFirstResult(custom.offset()).setMaxResults(custom.getPageSize()); //結(jié)果轉(zhuǎn)換 query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(ReportSpuSummarySumBo.class)); //得到最終的返回結(jié)果 List<ReportSpuSummarySumBo> results = query.getResultList();此案例僅僅為了說明 entityManager.createNativeQuery 的查詢方法,但是不推薦用這種用法,開發(fā)思路可轉(zhuǎn)換一下,做到心中有數(shù)即可。
案例2:find 方法
entityManager.find(UserInfoEntity.class,1);案例3:JPQL 的用法
Query query = entityManager.createQuery("SELECT c FROM Customer c"); List<Customer> result = query.getResultList();EntityManager 使用起來還是比較簡單的。
總結(jié)
以上是生活随笔為你收集整理的Spring Data JPA 从入门到精通~EntityManager介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PostgreSQL 分页——示例
- 下一篇: Spring Data JPA 从入门到