博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java baseentity_基于springframework的JpaDaoSupport的BaseJpaDao实现通用实体服务类EntityService...
阅读量:4579 次
发布时间:2019-06-08

本文共 14253 字,大约阅读时间需要 47 分钟。

一、前言

通过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@}

转载地址:http://nmqms.baihongyu.com/

你可能感兴趣的文章
资源相互引用时 需添加 PerformSubstitution=True
查看>>
MapRedece(单表关联)
查看>>
蒲公英App开发之检测新版本
查看>>
【安卓基础】倒计时按钮封装(验证码倒计时按钮)
查看>>
configparser模块
查看>>
SelectQueryBuilder的用法
查看>>
android的用户定位(一)
查看>>
creat-react-app搭建的项目中按需引入antd以及配置Less和如何修改antd的主题色
查看>>
IIS安装
查看>>
html块级元素和行级元素的区别和使用
查看>>
for循环嵌套
查看>>
寒冬夜行人
查看>>
poj1151 Atlantis
查看>>
HTML页面之间的参数传递
查看>>
java面试题集锦
查看>>
scikit-learn:4.2.3. Text feature extraction
查看>>
Spring Security构建Rest服务-0800-Spring Security图片验证码
查看>>
AE待整理
查看>>
java8中规范的四大函数式接口
查看>>
宝塔apache配置
查看>>