java baseentity_基于springframework的JpaDaoSupport的BaseJpaDao实现通用实体服务类EntityService...

本文介绍了如何基于Spring Framework的JpaDaoSupport实现通用的DAO对象BaseJpaDao,以及如何创建通用实体服务类EntityService,方便业务服务类继承复用。内容包括BaseJpaDao的查询、分页、自定义表达式等方法的实现,以及EntityService对持久化操作的封装。
摘要由CSDN通过智能技术生成

一、前言

通过springframework的orm的org.springframework.orm.jpa.support.JpaDaoSupport实现通用dao对象实现,实现通用的实体服务类EntityService,便于业务服务类继承复用

二、代码示例

1.继承dao依赖类BaseJpaDao,代码如下import java.util.List;@b@import javax.persistence.EntityManager;@b@import javax.persistence.PersistenceException;@b@import javax.persistence.Query;@b@import javax.persistence.TypedQuery;@b@import javax.persistence.criteria.CriteriaBuilder;@b@import javax.persistence.criteria.CriteriaQuery;@b@import javax.persistence.criteria.Root;@b@import javax.persistence.criteria.Selection;@b@@b@import org.springframework.orm.jpa.JpaCallback;@b@import org.springframework.orm.jpa.JpaTemplate;@b@import org.springframework.orm.jpa.support.JpaDaoSupport;@b@import org.springframework.util.Assert;@b@@b@import com.woopa.common.persist.expression.JpaCriteriaExpressionParser;@b@import com.woopa.common.persist.expression.SQLLikeExpressionParser; @b@@b@public class BaseJpaDao extends JpaDaoSupport {@b@@b@JpaTemplate template;@b@@b@protected void initDao(){@b@template = super.getJpaTemplate();@b@}@b@/**@b@ * 分页查询@b@ * @param @b@ * @param start@b@ * @param limit@b@ * @param queryString@b@ * @param values@b@ * @return@b@ */@b@public  List queryForPage(final int start, final int limit,@b@final String queryString, final Object... values){@b@return template.executeFind(new JpaCallback>(){@b@@Override@b@public List doInJpa(EntityManager em) throws PersistenceException {@b@Query query = em.createQuery(queryString);@b@if(values != null){@b@for(int i=0,len=values.length; i@b@ * @param queryString@b@ * @param values@b@ * @return@b@ */@b@public  T queryForObject(final String queryString, final Object... values){@b@return template.execute(new JpaCallback(){@b@@Override@b@public T doInJpa(EntityManager em) throws PersistenceException {@b@Query query = em.createQuery(queryString);@b@if(values != null){@b@for(int i=0,len=values.length; i@b@ * @param entityClass 实体类@b@ * @param expressions@b@ * @param values@b@ * @return @b@ */@b@public  List queryByExpressions(final Class entityClass, final String[] expressions, final Object... values){@b@return template.executeFind(new JpaCallback>(){@b@@Override@b@public List doInJpa(EntityManager em)@b@throws PersistenceException {@b@TypedQuery query = createQueryByExpressions(em, entityClass, expressions, values);@b@@b@template.prepareQuery(query);@b@@b@return query.getResultList();@b@}@b@});@b@}@b@/**@b@ * 简化表达式查询@b@ * IN查询表达可写为propertyName@I5,表示IN的参数有5个,@b@ * 同时参数values对应IN查询的参数必须是一个数组,数组长度应与@I后面的数字相等@b@ * @param @b@ * @param entityClass 实体类@b@ * @param selectHeadString 自定义SELECT头@b@ * @param expressions@b@ * @param values@b@ * @return @b@ */@b@public  T selectByExpressions(final Class entityClass, final String selectHeadString,@b@final String[] expressions, final Object... values){@b@Assert.notNull(expressions);@b@Assert.notNull(expressions);@b@Assert.notEmpty(expressions);@b@@b@return template.execute(new JpaCallback(){@b@@Override@b@public T doInJpa(EntityManager em)@b@throws PersistenceException {@b@Query query = createQueryByExpressions(em, entityClass, selectHeadString, expressions, values);@b@@b@template.prepareQuery(query);@b@@b@return (T) query.getSingleResult();@b@}@b@});@b@}@b@/**@b@ * 简化表达式查询@b@ * IN查询表达可写为propertyName@I5,表示IN的参数有5个,@b@ * 同时参数values对应IN查询的参数必须是一个数组,数组长度应与@I后面的数字相等@b@ * @param @b@ * @param entityClass 实体类@b@ * @param selectHeadString 自定义SELECT头@b@ * @param expressions@b@ * @param values@b@ * @return @b@ */@b@public List selectMutilByExpressions(final Class entityClass, final String selectHeadString,@b@final String[] expressions, final Object... values){@b@Assert.notNull(expressions);@b@Assert.notNull(expressions);@b@Assert.notEmpty(expressions);@b@@b@return template.executeFind(new JpaCallback(){@b@@Override@b@public List doInJpa(EntityManager em)@b@throws PersistenceException {@b@Query query = createQueryByExpressions(em, entityClass, selectHeadString, expressions, values);@b@@b@template.prepareQuery(query);@b@@b@return query.getResultList();@b@}@b@});@b@}@b@@b@@b@/**@b@ * 简化表达式分页查询@b@ * IN查询表达可写为propertyName@I5,表示IN的参数有5个,@b@ * 同时参数values对应IN查询的参数必须是一个数组,数组长度应与@I后面的数字相等@b@ * @param @b@ * @param entityClass 实体类@b@ * @param start@b@ * @param limit@b@ * @param expressions@b@ * @param values@b@ * @return @b@ */@b@public  List queryForPageByExpressions(final Class entityClass, final int start, final int limit, @b@final String[] expressions, final Object... values){@b@return template.executeFind(new JpaCallback>(){@b@@Override@b@public List doInJpa(EntityManager em)@b@throws PersistenceException {@b@TypedQuery query = createQueryByExpressions(em, entityClass, expressions, values);@b@@b@template.prepareQuery(query);@b@@b@return query.setFirstResult(start).setMaxResults(limit).getResultList();@b@}@b@});@b@}@b@@b@/**@b@ * 辅助方法,根据查询表达式和参数创建Query对象@b@ */@b@private  TypedQuery createQueryByExpressions(EntityManager em, Class entityClass,@b@String[] expressions, Object... values) throws PersistenceException {@b@TypedQuery query =  em.createQuery("select o from "+entityClass.getCanonicalName()+" o where 1=1"@b@+ SQLLikeExpressionParser.parseToHQL(expressions), entityClass);@b@@b@if (null != values){@b@int index = 1;@b@for(int i=0,len=values.length; i注意:查询表达式有括号的括号内表达式有且仅能有两个@b@ * @param @b@ * @param entityClass 实体类@b@ * @param expressions@b@ * @param values@b@ * @return@b@ */@b@public  List queryForEntityBean(final Class entityClass,@b@final String[] expressions, final Object... values){@b@return template.executeFind(new JpaCallback>(){@b@@Override@b@public List doInJpa(EntityManager em) throws PersistenceException {@b@CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();@b@CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(entityClass);@b@@b@JpaCriteriaExpressionParser.handleExpressions(entityClass, criteriaBuilder, @b@criteriaQuery, expressions, values);@b@@b@@b@return  em.createQuery(criteriaQuery).getResultList();@b@}@b@});@b@}@b@/**@b@ * 查询实体类,用查询表达式动态创建Criteria查询,可指定只查询那些属性字段
@b@ * 查询表达式有括号的括号内表达式有且仅能有两个
@b@ * 注意:实体类必须有指定字段的构造方法
@b@ * 如实体类User,指定了name和password,则User必须有public User(String name,String password)构造方法
@b@ * @param @b@ * @param entityClass 实体类@b@ * @param includeFields 包含的字段@b@ * @param expressions@b@ * @param values@b@ * @return@b@ */@b@public  List queryForEntityBean(final Class entityClass, final String[] includeFields,@b@final String[] expressions, final Object... values){@b@return template.executeFind(new JpaCallback>(){@b@@Override@b@public List doInJpa(EntityManager em) throws PersistenceException {@b@CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();@b@CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(entityClass);@b@@b@Root root = JpaCriteriaExpressionParser.handleExpressions(entityClass, criteriaBuilder, @b@criteriaQuery, expressions, values);@b@@b@if(includeFields != null){@b@Selection extends T>[] selections = new Selection[includeFields.length];@b@for(int i=0,len=includeFields.length; i@b@ * @param sql@b@ * @param values@b@ * @return@b@ */@b@public  T getBySQL(final String sql, final Object... values){@b@return getBySQL(null, sql, values);@b@}@b@@b@/**@b@ * 单实体对象SQL查询@b@ * @param @b@ * @param entityClass@b@ * @param sql@b@ * @param values@b@ * @return@b@ */@b@public  T getBySQL(final Class entityClass, final String sql, final Object... values){@b@return template.execute(new JpaCallback(){@b@@Override@b@public T doInJpa(EntityManager em) throws PersistenceException {@b@Query query = null;@b@if(entityClass != null){@b@query = em.createNativeQuery(sql, entityClass);@b@}else{@b@query = em.createNativeQuery(sql);@b@}@b@if(values != null){@b@for(int i=0,len=values.length; i@b@ * @param sql@b@ * @param values@b@ * @return@b@ */@b@public  List listBySQL(final String sql, final Object... values){@b@return listBySQL(null, sql, values);@b@}@b@/**@b@ * 实体对象集合SQL查询@b@ * @param @b@ * @param entityClass@b@ * @param sql@b@ * @param values@b@ * @return@b@ */@b@public  List listBySQL(final Class entityClass, final String sql, final Object... values){@b@return template.executeFind(new JpaCallback>(){@b@@Override@b@public List doInJpa(EntityManager em) throws PersistenceException {@b@Query query = null;@b@if(entityClass != null){@b@query = em.createNativeQuery(sql, entityClass);@b@}else{@b@query = em.createNativeQuery(sql);@b@}@b@if(values != null){@b@for(int i=0,len=values.length; i@b@ * @param sql@b@ * @param start@b@ * @param limit@b@ * @param values@b@ * @return@b@ */@b@public  List listForPageBySQL(final String sql, final int start, final int limit,final Object... values){@b@return template.executeFind(new JpaCallback>(){@b@@Override@b@public List doInJpa(EntityManager em) throws PersistenceException {@b@Query query = em.createNativeQuery(sql);@b@if(values != null){@b@for(int i=0,len=values.length; i values){@b@return template.execute(new JpaCallback(){@b@@Override@b@public int[] doInJpa(EntityManager em) throws PersistenceException {@b@Query query = em.createNativeQuery(sql);@b@if(values != null){@b@int[] resultInts = new int[values.size()];@b@for(int i=0,len=values.size(); i

2. 通用服务类接口IEntityService,如下所示import java.util.Collection;@b@import java.util.List; @b@import com.woopa.common.persist.PageBean; @b@@b@public interface IEntityService {@b@@b@void persist(E entity);@b@@b@void merge(E entity);@b@@b@void remove(E entity);@b@@b@void remove(Collection entities);@b@@b@List listAll();@b@@b@E get(String expression, Object... values);@b@@b@E get(String[] expressions, Object... values);@b@@b@List listByExpression(String expression, Object... values);@b@@b@List listByExpressions(String[] expressions, Object... values);@b@@b@List listPageByExpression(final int start, final int limit,@b@final String expression, final Object... values);@b@@b@List listPageByExpressions(final int start, final int limit,@b@final String[] expressions, final Object... values);@b@@b@PageBean queryForPageBean(int start, int limit, @b@String listQueryString, String totalQueryString, Object... values);@b@@b@PageBean queryForPageBeanByExpressions(int start, int limit, @b@String[] expressions, Object... values);@b@}

3.通用服务实现类EntityService,代码如下import java.util.Collection;@b@import java.util.HashMap;@b@import java.util.Iterator;@b@import java.util.List;@b@import java.util.Map;@b@@b@import com.woopa.common.util.Assert;@b@import com.woopa.common.util.ReflectUtils;@b@import com.woopa.common.persist.PageBean; @b@ @b@public class EntityService implements IEntityService {@b@@b@private int batchFetchSize = 20; @b@@b@private BaseJpaDao dao;@b@@b@protected Class entityClass;@b@@b@@b@public EntityService(){@b@entityClass = ReflectUtils.getSuperClassGenricType(getClass(), 0);@b@}@b@@b@public void persist(Collection entities) {@b@Assert.notNull(entities);@b@@b@Iterator ite = entities.iterator();@b@@b@for(int i=0; i注意:必须在一个事务中使用此方法@b@ * @param entity@b@ */@b@protected void refresh(E entity) {@b@Assert.notNull(entity);@b@@b@dao.template.refresh(entity);@b@}@b@@b@public void remove(E entity) {@b@Assert.notNull(entity);@b@@b@dao.template.remove(entity);@b@}@b@@b@public void remove(Collection entities) {@b@Assert.notNull(entities);@b@@b@Iterator ite = entities.iterator();@b@@b@for(int i=0; i list = dao.queryByExpressions(entityClass, expressions, values);@b@@b@return list != null && list.size() > 0 ? list.get(0) : null;@b@}@b@@b@public List listAll() {@b@return dao.template.find("from "+entityClass.getCanonicalName()+" o");@b@}@b@@b@protected List list(String queryString, Object... values) {@b@return dao.template.find(queryString, values);@b@}@b@@b@protected List list(String queryString, String[] namedParams,@b@Object... values) {@b@Map params = null;@b@if(namedParams != null){@b@params = new HashMap(namedParams.length);@b@for(int i=0,len=namedParams.length; i listByExpression(String expression, Object... values){@b@return listByExpressions(new String[]{expression}, values);@b@}@b@@b@public List listByExpressions(String[] expressions, Object... values){@b@return dao.queryByExpressions(entityClass, expressions, values);@b@}@b@@b@@b@public List listPageByExpression(final int start, final int limit,@b@final String expression, final Object... values){@b@@b@return listPageByExpressions(start, limit, new String[]{expression}, values);@b@}@b@@b@public List listPageByExpressions(final int start, final int limit,@b@final String[] expressions, final Object... values){@b@return dao.queryForPageByExpressions(entityClass, start, limit, expressions, values);@b@}@b@@b@protected List listForPage(int start, int limit, String queryString,@b@Object... values) {@b@return dao.queryForPage(start, limit, queryString, values);@b@}@b@@b@protected long queryForLong(String queryString, Object... values) {@b@return dao.queryForObject(queryString, values);@b@}@b@@b@protected int queryForInt(String queryString, Object... values) {@b@return dao.queryForObject(queryString, values);@b@}@b@@b@protected  T getUnique(String queryString, Object... values){@b@return dao.queryForObject(queryString, values);@b@}@b@@b@protected  List queryForList(String queryString,@b@Object... values) {@b@return dao.template.find(queryString, values);@b@}@b@@b@protected  List queryForPage(int start, int limit,@b@String queryString, Object... values) {@b@return dao.queryForPage(start, limit, queryString, values);@b@}@b@@b@public PageBean queryForPageBean(int start, int limit, @b@String listQueryString , String totalQueryString, Object... values){@b@List list = dao.queryForPage(start, limit, listQueryString, values);@b@@b@long totalRecords = dao.queryForObject(totalQueryString, values);@b@@b@return new PageBean(start, limit, list, totalRecords);@b@}@b@@b@public PageBean queryForPageBeanByExpressions(int start, int limit, @b@String[] expressions, Object... values){@b@List list = dao.queryForPageByExpressions(entityClass, start, limit, expressions, values);@b@@b@long totalRecords = dao.selectByExpressions(entityClass, "SELECT COUNT(*)", expressions, values);@b@@b@return new PageBean(start, limit, list, totalRecords);@b@}@b@@b@public BaseJpaDao getDao() {@b@return dao;@b@}@b@@b@public void setDao(BaseJpaDao dao) {@b@this.dao = dao;@b@}@b@@b@public int getBatchFetchSize() {@b@return batchFetchSize;@b@}@b@@b@public void setBatchFetchSize(int batchFetchSize) {@b@this.batchFetchSize = batchFetchSize;@b@}@b@}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值