Spring Data JPA 从入门到精通~EntityManager介绍

EntityManager 介绍

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

public interface EntityManager {
  /**
    *根据主键查询实体对象
    */
  public  T find(Class entityClass, Object primaryKey);
    /**
     *  支持JQPL的语法
     * @param qlString a Java Persistence query string
     */
    public Query createQuery(String qlString);
    /**
     * 利用CriteriaQuery来创建查询
     * @param criteriaQuery  a criteria query object
     */
    public  TypedQuery createQuery(CriteriaQuery 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 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 results = query.getResultList();

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

案例2:find 方法

entityManager.find(UserInfoEntity.class,1);

案例3:JPQL 的用法

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

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

你可能感兴趣的:(JPA,Java,spring,java)