1 packagecom.sanqing.dao;2
3 importjava.beans.Introspector;4 importjava.beans.PropertyDescriptor;5 importjava.io.Serializable;6 importjava.lang.reflect.Method;7 importjava.util.LinkedHashMap;8
9 importjavax.persistence.EmbeddedId;10 importjavax.persistence.Entity;11 importjavax.persistence.EntityManager;12 importjavax.persistence.PersistenceContext;13 importjavax.persistence.Query;14
15 importorg.springframework.transaction.annotation.Propagation;16 importorg.springframework.transaction.annotation.Transactional;17
18 importcom.sanqing.util.GenericsUtils;19 importcom.sanqing.util.QueryResult;20
21 @SuppressWarnings("unchecked")22 @Transactional23 public abstract class DaoSupport implements DAO{24 protected Class entityClass = GenericsUtils.getSuperClassGenricType(this.getClass());//获得该类的父类的泛型参数的实际类型
25 @PersistenceContext protectedEntityManager em;26 public void clear(){//清除一级缓存的数据
27 em.clear();28 }29 public void delete(Serializable ... entityids) {//删除记录
30 for(Object id : entityids){31 em.remove(em.getReference(this.entityClass, id));32 }33 }34 @Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)35 public T find(Serializable entityId) {//通过主键获得记录
36 if(entityId==null) throw new RuntimeException(this.entityClass.getName()+ ":传入的实体id不能为空");37 return em.find(this.entityClass, entityId);38 }39 public void save(Object entity) {//保存记录
40 em.persist(entity);41 }42 @Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)43 public long getCount() { //获得记录总数
44 return (Long)em.createQuery("select count("+ getCountField(this.entityClass) +") from "+ getEntityName(this.entityClass)+ " o").getSingleResult();45 }46
47 protected static String getCountField(Classclazz){48 String out = "o";49 try{50 PropertyDescriptor[] propertyDescriptors =Introspector.getBeanInfo(clazz).getPropertyDescriptors();51 for(PropertyDescriptor propertydesc : propertyDescriptors){52 Method method =propertydesc.getReadMethod();53 if(method!=null && method.isAnnotationPresent(EmbeddedId.class)){54 PropertyDescriptor[] ps =Introspector.getBeanInfo(propertydesc.getPropertyType()).getPropertyDescriptors();55 out = "o."+ propertydesc.getName()+ "." + (!ps[1].getName().equals("class")? ps[1].getName(): ps[0].getName());56 break;57 }58 }59 } catch(Exception e) {60 e.printStackTrace();61 }62 returnout;63 }64
65 protected static voidsetQueryParams(Query query, Object[] queryParams){66 if(queryParams!=null && queryParams.length>0){67 for(int i=0; i orderby){//组装order by语句
73 StringBuffer orderbyql = new StringBuffer("");74 if(orderby!=null && orderby.size()>0){75 orderbyql.append(" order by ");76 for(String key : orderby.keySet()){77 orderbyql.append("o.").append(key).append(" ").append(orderby.get(key)).append(",");78 }79 orderbyql.deleteCharAt(orderbyql.length()-1);80 }81 returnorderbyql.toString();82 }83 protected static String getEntityName(Class clazz){//获取实体的名称
84 String entityname =clazz.getSimpleName();85 Entity entity = clazz.getAnnotation(Entity.class);86 if(entity.name()!=null && !"".equals(entity.name())){87 entityname =entity.name();88 }89 returnentityname;90 }91
92 public void update(Object entity) {//更新记录
93 em.merge(entity);94 }95 @Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)96 public QueryResult getScrollData(intfirstindex,97 int maxresult, LinkedHashMap orderby) {//获得分页记录
98 return getScrollData(firstindex,maxresult,null,null,orderby);99 }100 @Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)101 public QueryResult getScrollData(intfirstindex,102 int maxresult, String wherejpql, Object[] queryParams) {//获得分页记录
103 return getScrollData(firstindex,maxresult,wherejpql,queryParams,null);104 }105 @Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)106 public QueryResult getScrollData(int firstindex, int maxresult) {//获得分页记录
107 return getScrollData(firstindex,maxresult,null,null,null);108 }109 @Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)110 public QueryResultgetScrollData() {111 return getScrollData(-1, -1);112 }113 @Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)114 public QueryResult getScrollData(int firstindex, intmaxresult, String wherejpql,115 Object[] queryParams,LinkedHashMap orderby) {//获得分页记录
116 QueryResult qr = new QueryResult();//查询记录结果
117 String entityname = getEntityName(this.entityClass);//获得实体名称
118 Query query = em.createQuery("select o from "+
119 entityname+ " o "+(wherejpql==null
120 || "".equals(wherejpql.trim())? "":121 "where "+ wherejpql)+ buildOrderby(orderby));//执行查询
122 setQueryParams(query, queryParams);//设置查询参数
123 if(firstindex!=-1 && maxresult!=-1) //两个参数都不是-1的时候才分页
124 query.setFirstResult(firstindex).125 setMaxResults(maxresult);//设置查询记录的起始位置和查询最大数
126 qr.setResultlist(query.getResultList());//设置查询的记录
127 query = em.createQuery("select count(" +
128 getCountField(this.entityClass)+ ") " +
129 "from "+ entityname+ " o "+(wherejpql==null ||
130 "".equals(wherejpql.trim())? "": "where "+wherejpql));131 setQueryParams(query, queryParams);//设置查询参数
132 qr.setTotalrecord((Long)query.getSingleResult());//设置查询记录总数
133 return qr;//返回查询记录结果
134 }135
136
137 }