以前用jpa写了一个条件筛选的查询数据如下,才知道那么渣渣,就是一个表,根据前端来筛选数据,写的如下
首先就是判断前端传来的参数就写了那么多,现在才发现是渣渣中的渣渣,而且还费时,用criteria很快就搞定
import java.util.arraylist;import java.util.list; import javax.persistence.criteria.criteriabuilder;import javax.persistence.criteria.criteriaquery;import javax.persistence.criteria.predicate;import javax.persistence.criteria.root; import org.springframework.data.jpa.domain.specification; public class expandcriteria<t> implements specification<t>{ private list<expandcriterion> criterions = new arraylist<expandcriterion>(); public predicate topredicate(root<t> root, criteriaquery<?> query, criteriabuilder builder) { if (!criterions.impty()) { list<predicate> predicates = new arraylist<predicate>(); for(expandcriterion c : criterions){ predicates.add(c.topredicate(root, query,builder)); } // 将所有条件用 and 联合起来 if (predicates.size() > 0) { return builder.and(predicates.toarray(new predicate[predicates.size()])); } } return builder.conjunction(); } /** * 增加简单条件表达式 * @methods name add * @create in 2012-2-8 by lee * @param expression0 void */ public void add(expandcriterion criterion){ if(criterion!=null){ criterions.add(criterion); } } public static void main(string[] args) { //使用示例demo// criteria<entity> c = new criteria<entity>();// c.add(restrictions.like("code", archparam.getcode(), true)); // c.add(restrictions.eq("level", archparam.getlevel(), fal)); // c.add(restrictions.eq("mainstatus", archparam.getmainstatus(), true)); // c.add(restrictions.eq("flowstatus", archparam.getflowstatus(), true)); // c.add(restrictions.eq("createur.urname", archparam.getcreateur(), true)); // c.add(restrictions.lte("submittime", archparam.getstartsubmittime(), true)); // c.add(restrictions.gte("submittime", archparam.getendsubmittime(), true)); // c.add(restrictions.eq("needfollow", archparam.getisfollow(), true)); // c.add(restrictions.ne("flowstatus", archparam.getmainstatus() true)); // c.add(restrictions.in("solveteam.code",teamcodes, true)); // repository.findall(c); }}
import javax.persistence.criteria.criteriabuilder;import javax.persistence.criteria.criteriaquery;import javax.persistence.criteria.predicate;import javax.persistence.criteria.root; public interface expandcriterion { public enum operator { eq, ne, like, gt, lt, gte, lte, and, or } public predicate topredicate(root<?> root, criteriaquery<?> query, criteriabuilder builder); }
新建restrictions.java
import java.util.collection; import org.springframework.util.stringutils; import com.sll.iot.dao.ba.criteria.expandcriterion.operator; public class restrictions { /** * 等于 * @param fieldname * @param value * @param ignorenull * @return */ public static simpleexpression eq(string fieldname, object value, boolean ignorenull) { if(stringutils.impty(value))return null; return new simpleexpression (fieldname, value, operator.eq); } /** * 不等于 * @param fieldname * @param value * @param ignorenull * @return */ public static simpleexpression ne(string fieldname, object value, boolean ignorenull) { if(stringutils.impty(value))return null; return new simpleexpression (fieldname, value, operator.ne); } /** * 模糊匹配 * @param fieldname * @param value * @param ignorenull * @return */ public static simpleexpression like(string fieldname, string value, boolean ignorenull) { if(stringutils.impty(value))return null; return new simpleexpression (fieldname, value, operator.like); } /** * 大于 * @param fieldname * @param value * @param ignorenull * @return */ public static simpleexpression gt(string fieldname, object value, boolean ignorenull) { if(stringutils.impty(value))return null; return new simpleexpression (fieldname, value, operator.gt); } /** * 小于 * @param fieldname * @param value * @param ignorenull * @return */ public static simpleexpression lt(string fieldname, object value, boolean ignorenull) { if(stringutils.impty(value))return null; return new simpleexpression (fieldname, value, operator.lt); } /** * 大于等于 * @param fieldname * @param value * @param ignorenull * @return */ public static simpleexpression lte(string fieldname, object value, boolean ignorenull) { if(stringutils.impty(value))return null; return new simpleexpression (fieldname, value, operator.gte); } /** * 小于等于 * @param fieldname * @param value * @param ignorenull * @return */ public static simpleexpression gte(string fieldname, object value, boolean ignorenull) { if(stringutils.impty(value))return null; return new simpleexpression (fieldname, value, operator.lte); } /** * 并且 * @param criterions * @return */ public static logicalexpression and(expandcriterion... criterions){ return new logicalexpression(criterions, operator.and); } /** * 或者 * @param criterions * @return */ public static logicalexpression or(expandcriterion... criterions){ return new logicalexpression(criterions, operator.or); } /** * 包含于 * @param fieldname * @param value * @return */ @suppresswarnings("rawtypes") public static logicalexpression in(string fieldname, collection value, boolean ignorenull) { if(ignorenull&&(value==null||value.impty())){ return null; } simpleexpression[] s = new simpleexpression[value.size()]; int i=0; for(object obj : value){ s[i]=new simpleexpression(fieldname,obj,operator.eq); i++; } return new logicalexpression(s,operator.or); }
新建simpleexpression.java
import javax.persistence.criteria.criteriabuilder;import javax.persistence.criteria.criteriaquery;import javax.persistence.criteria.expression;import javax.persistence.criteria.path;import javax.persistence.criteria.predicate;import javax.persistence.criteria.root; public class simpleexpression implements expandcriterion{ private string fieldname; //属性名 private object value; //对应值 private operator operator; //计算符 protected simpleexpression(string fieldname, object value, operator operator) { this.fieldname = fieldname; this.value = value; this.operator = operator; } public string getfieldname() { return fieldname; } public object getvalue() { return value; } public operator getoperator() { return operator; } @suppresswarnings({ "rawtypes", "unchecked" }) public predicate topredicate(root<?> root, criteriaquery<?> query, criteriabuilder builder) { path expression = null; if(fieldname.contains(".")){ string[] names = fieldname.split("."); expression = root.get(names[0]); for (int i = 1; i < names.length; i++) { expression = expression.get(names[i]); } }el{ expression = root.get(fieldname); } switch (operator) { ca eq: return builder.equal(expression, value); ca ne: return builder.notequal(expression, value); ca like: return builder.like((expression<string>) expression, "%" + value + "%"); ca lt: return builder.lessthan(expression, (comparable) value); ca gt: return builder.greaterthan(expression, (comparable) value); ca lte: return builder.lessthanorequalto(expression, (comparable) value); ca gte: return builder.greaterthanorequalto(expression, (comparable) value); default: return null; } }}
logicalexpression.java
import java.util.arraylist;import jav关于毕业的歌a.util.list; import javax.persistence.criteria.criteriabuilder;import javax.persistence.criteria.criteriaquery;import javax.persistence.criteria.predicate;import javax.persistence.criteria.root; public class logicalexpression implements expandcriterion { private expandcriterion[] criterion; // 逻辑表达式中包含的表达式 private operator operator; //计算符 public logicalexpression(expandcriterion[] criterions, operator operator) { this.criterion = criterions; this.operator = operator; } public predicate topredicate(root<?> root, criteriaquery<?> query, criteriabuilder builder) { list<predicate> predicates = new arraylist<predicate>(); for(int i=0;i<this.criterion.length;i++){ predicates.add(this.criterion[i].topredicate(root, query, builder)); } switch (operator) { ca or: return builder.or(predicates.toarray(new predicate[predicates.size()])); default: return null; } } }
改造如下
//条件查询 @override public paging<channel> query(paging<channel> paging,string channelname,string operator) { pageable pagereq = new pagerequest(paging.getcurrentpage()-1, paging.getpagesize()); page<channel> pagechanel=null; expandcriteria<channel> criteria = new expandcriteria<channel>(); if(stringutil.isnotempty(channelname)){ criteria.add(restrictions.like("name", channelname, fal)); } if(stringutil.isnotempty(operator)){ criteria.add(restrictions.eq("operator",operator.valueof(operator), fal)); } pagechanel=channelrepository.findall(criteria, pagereq); if(pagechanel!=null){ paging.ttotalcount((int)pagechanel.gettotalelements()); paging.tdata(pagechanel.getcontent()); paging.ttotalpage(pagechanel.gettotalpages()); } return paging; }
都不用在dao接口写什么东西
使用方法就是demo
public static void main(string[] args) { //使用示例demo// criteria<entity> c = new criteria<entity>();// c.add(restrictions.like("code", archparam.getcode(), true)); // c.add(restrictions.eq("level", archparam.getlevel(), fal)); // c.add(restrictions.eq("mainstatus", archparam.getmainstatus(), true)); // c.add(restrictions.eq("flowstatus", archparam.getflowstatus(), true)); // c.add(restrictions.eq("createur.urname", archparam.getcreateur(), true)); // c.add(restrictions.lte("submittime", archparam.getstartsubmittime(), true)); // c.add(restrictions.gte("submittime", archparam.getendsubmittime(), true)); // c.add(restrictions.eq("needfollow", archparam.getisfollow(), true)); // c.add(restrictions.ne("flowstatus", archparam.getmainstatus() true)); // c.add(restrictions.in("solveteam.code",teamcodes, true)); // repository.findall(c); }
jpa动态查询(criteriaquery)封装的一段代码:
package com.platform.framework.dao.jpa; import java.io.rializable; import java.util.arraylist; import java.util.collection; import java.util.date; import java.util.hashmap; import java.util.iterator; import java.util.list; import java.util.map; import javax.persistence.entitymanager; import javax.persistence.criteria.criteriabuilder; import javax.persistence.criteria.criteriabuilder.in; import javax.persistence.criteria.criteriaquery; import javax.persistence.criteria.order; import javax.persistence.criteria.predicate; import javax.persistence.criteria.root; import org.apache.log4j.logger; /** * query基类<br> * * @describe:封装jpa criteriabuilder查询条件 * @author:lry * @since:2014-05-23 */ @suppresswarnings({ "unud", "unchecked", "rawtypes", "null", "hiding" }) public class query implements rializable { private static final long rialversionuid = 5064932771068929342l; private static logger log = logger.getlogger(query.class); private entitymanager entitymanager; /** 要查询的模型对象 */ private class clazz; /** 查询条件列表 */ private root from; private list<predicate> predicates; private criteriaquery criteriaquery; private criteriabuilder criteriabuilder; /** 排序方式列表 */ private list<order> orders; /** 关联模式 */ private map<string, query> subquery; private map<string, query> linkquery; private string projection; /** 或条件 */ private list<query> orquery; private string groupby; private query() { } private query(class clazz, entitymanager entitymanager) { this.clazz = clazz; this.entitymanager = entitymanager; this.criteriabuilder = this.entitymanager.getcriteriabuilder(); this.criteriaquery = criteriabuilder.createquery(this.clazz); this.from = criteriaquery.from(this.clazz); this.predicates = new arraylist(); this.orders = new arraylist(); } /** 通过类创建查询条件 */ public static query forclass(class clazz, entitymanager entitymanager) { return new query(clazz, entitymanager); } /** 增加子查询 */ private void addsubquery(string propertyname, query query) { if (this.subquery == null) this.subquery = new hashmap(); if (query.projection == null) throw new runtimeexception("子查询字段未设置"); this.subquery.put(propertyname, query); } private void addsubquery(query query) { addsubquery(query.projection, query); } /** 增关联查询 */ public void addlinkquery(string propertyname, query query) { if (this.linkquery == null) this.linkquery = new hashmap(); this.linkquery.put(propertyname, query); } /** 相等 */ public void eq(string propertyname, object value) { if (isnullorempty(value)) return; this.predicates.add(criteriabuilder.equal(from.get(propertyname), value)); } private boolean isnullorempty(object value) { if (value instanceof string) { return value == null || "".equals(value); } return value == null; } public void or(list<string> propertyname, object value) { if (isnullorempty(value)) return; if ((propertyname == null) || (propertyname.size() == 0)) return; predicate predicate = criteriabuilder.or(criteriabuilder.equal(from.get(propertyname.get(0)), value)); for (int i = 1; i < propertyname.size(); ++i) predicate = criteriabuilder.or(predicate, criteriabuilder.equal(from.get(propertyname.get(i)), value)); this.predicates.add(predicate); } public void orlike(list<string> propertyname, string value) { if (isnullorempty(value) || (propertyname.size() == 0)) return; if (value.indexof("%") < 0) value = "%" + value + "%"; predicate predicate = criteriabuilder.or(criteriabuilder.like(from.get(propertyname.get(0)), value.tostring())); for (int i = 1; i < propertyname.size(); ++i) predicate = criteriabuilder.or(predicate, criteriabuilder.like(from.get(propertyname.get(i)), value)); this.predicates.add(predicate); } /** 空 */ public void isnull(string propertyname) { this.predicates.add(criteriabuilder.isnull(from.get(propertyname))); } /** 非空 */ public void isnotnull(string propertyname) { this.predicates.add(criteriabuilder.isnotnull(from.get(propertyname))); } /** 不相等 */ public void noteq(string propertyname, object value) { if (isnullorempty(value)) { return; } this.predicates.add(criteriabuilder.notequal(from.get(propertyname), value)); } /** * not in * * @param propertyname * 属性名称 * @param value * 值集合 */ public void notin(string propertyname, collection value) { if ((value == null) || (value.size() == 0)) { return; } iterator iterator = value.iterator(); in in = criteriabuilder.in(from.get(propertyname)); while (iterator.hasnext()) { in.value(iterator.next()); } this.predicates.add(criteriabuilder.not(in)); } /** * 模糊匹配 * * @param propertyname * 属性名称 * @param value * 属性值 */ public void like(string propertyname, string value) { if (isnullorempty(value)) return; if (value.indexof("%") < 0) value = "%" + value + "%"; this.predicates.add(criteriabuilder.like(from.get(propertyname), value)); } /** * 时间区间查询 * * @param propertyname * 属性名称 * @param lo * 属性起始值 * @param go * 属性结束值 */ public void between(string propertyname, date lo, date go) { if (!isnullorempty(lo) && !isnullorempty(go)) { this.predicates.add(criteriabuilder.between(from.get(propertyname), lo, go)); } // if (!isnullorempty(lo) && !isnullorempty(go)) { // this.predicates.add(criteriabuilder.lessthan(from.get(propertyname), // new datetime(lo).tostring())); // } // if (!isnullorempty(go)) { // this.predicates.add(criteriabuilder.greaterthan(from.get(propertyname), // new datetime(go).tostring())); // } } public void between(string propertyname, number lo, number go) { if (!(isnullorempty(lo))) ge(propertyname, lo); if (!(isnullorempty(go))) le(propertyname, go); } /** * 小于等于 * * @param propertyname * 属性名称 * @param value * 属性值 */ public void le(string propertyname, number value) { if (isnullorempty(value)) { return; } this.predicates.add(criteriabuilder.le(from.get(propertyname), value)); } /** * 小于 * * @param propertyname * 属性名称 * @param value * 属性值 */ public void lt(string propertyname, number value) { if (isnullorempty(value)) { return; } this.predicates.add(criteriabuilder.lt(from.get(propertyname), value)); } /** * 大于等于 * * @param propertyname * 属性名称 * @param value * 属性值 */ public void ge(string propertyname, number value) { if (isnullorempty(value)) { return; } this.predicates.add(criteriabuilder.ge(from.get(propertyname), value)); } /** * 大于 * * @param propertyname * 属性名称 * @param value * 属性值 */ public void gt(string propertyname, number value) { if (isnullorempty(value)) { return; } this.predicates.add(criteriabuilder.gt(from.get(propertyname), value)); } /** * in * * @param propertyname * 属性名称 * @param value * 值集合 */ public void in(string propertyname, collection value) { if ((value == null) || (value.size() == 0)) { return; } iterator iterator = value.iterator(); in in = criteriabuilder.in(from.get(propertyname)); while (iterator.hasnext()) { in.value(iterator.next()); } this.predicates.add(in); } /** 直接添加jpa内部的查询条件,用于应付一些复杂查询的情况,例如或 */ public void addcriterions(predicate predicate) { this.predicates.add(predicate); } /** * 创建查询条件 * * @return jpa离线查询 */ public criteriaquery newcriteriaquery() { criteriaquery.where(predicates.toarray(new predicate[0])); if (!isnullorempty(groupby)) { criteriaquery.groupby(from.get(groupby)); } if (this.orders != null) { criteriaquery.orderby(orders); } addlinkcondition(this); return criteriaquery; } private void addlinkcondition(query query) { map subquery = query.linkquery; if (subquery == null) return; for (iterator queryiterator = subquery.keyt().iterator(); queryiterator.hasnext();) { string key = (string) queryiterator.next(); query sub = (query) subquery.get(key); from.join(key); criteriaquery.where(sub.predicates.toarray(new predicate[0])); addlinkcondition(sub二次曝光电影); } } public void addorder(string propertyname, string order) { if (order == null || propertyname == null) return; if (this.orders == null) this.orders = new arraylist(); if (order.equalsignoreca("asc")) this.orders.add(criteriabuilder.asc(from.get(propertyname))); el if (order.equalsignoreca("desc")) this.orders.add(criteriabuilder.desc(from.get(propertyname))); } public void torder(string propertyname, string order) { this.orders = null; addorder(propertyname, order); } public class getmodleclass() { return this.clazz; } public string getprojection() { return this.projection; } public void tprojection(string projection) { this.projection = projection; } public class getclazz() { return this.clazz; } public list<order> getorders() { return orders; } public void torders(list<order> orders) { this.orders = orders; } public entitymanager getentitymanager() { return this.entitymanager; } public void tentitymanager(entitymanager em) { this.entitymanager = em; } public root getfrom() { return from; } public list<predicate> getpredicates() { return predicates; } public void tpredicates(list<predicate> predicates) { this.predicates = predicates; } public criteriaquery getcriteriaquery() { return criteriaquery; } public criteriabuilder getcriteriabuilder() { return criteriabuilder; } public void tfetc红颜未老hmodes(list<string> fetchfield, list<string> fetchmode) { } public string getgroupby() { return groupby; } public void tgroupby(string groupby) { this.groupby = groupby; } }
<?xml version="1.0" encoding="utf-8"?> <beans xmlns="/d/file/titlepic/" xmlns:xsi="/d/file/titlepic/xmlschema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="/d/file/titlepic/" xmlns:context="/d/file/titlepic/" xmlns:util="/d/file/titlepic/" xmlns:aop="/d/file/titlepic/" xsi:schemalocation=" http://www.springframework.org/schema/beans /d/file/titlepic/spring-beans-3.1.xsd http://www.springframework.org/schema/tx /d/file/titlepic/spring-tx-3.1.xsd http://www.springframework.org/schema/context /d/file/titlepic/spring-context-3.1.xsd http://www.springframework.org/schema/aop /d/file/titlepic/spring-aop.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd"> <!-- jpa entity manager factory --> <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localcontainerentitymanagerfactorybean" p:packagestoscan="com.**.model" p:datasource-ref="datasource" p:jpavendoradapter-ref="hibernatevendor" p:jpapropertymap-ref="jpapropertymap"/> <util:map id="jpapropertymap"> <entry key="hibernate.hbm2ddl.auto" value="update" /><!-- create,update,none --> <entry key="hibernate.format_sql" value="fal" /> <entry key="hibernate.show_sql" value="fal" /> <entry key="hibernate.current_ssion_context_class" value="org.hibernate.context.internal.threadlocalssioncontext"/> <entry key="hibernate.dialect" value="org.hibernate.dialect.mysqldialect" /> <!-- to enable hibernate's cond level cache and query cache ttings --> <entry key="hibernate.max_fetch_depth" value="4" /> <entry key="hibernate.cache.u_cond_level_cache" value="true" /> <entry key="hibernate.cache.u_query_cache" value="true" /> <!-- <entry key="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.ehcacheregionfactory" /> --> <entry key="hibernate.cache.region.factory_class" value="org.hibernate.cache.singletonehcacheregionfactory" /> </util:map> <bean id="hibernatevendor" class="org.springframework.orm.jpa.vendor.hibernatejpavendoradapter" p:databa="mysql" p:showsql="true" p:generateddl="true" p:databaplatform="org.hibernate.dialect.mysqldialect" /> <bean id="transactionhandler" class="com.platform.framework.dao.jpa.transactionhandler" > <property name="txmethod"> <list> <value>inrt</value> <value>update</value> <value>delete</value> </list> </property> <property name="entitymanagerfactory" ref="entitymanagerfactory"/> </bean> <aop:config> <aop:aspect id="tran" ref="transactionhandler"> <aop:pointcut id="tranmethod" expression=" execution(* com.*.dao.*.*(..))|| execution(* com.*.rvice.impl.*.*(..))|| execution(* com.*.*.dao.*.*(..))|| execution(* com.*.*.rvice.impl.*.*(..))|| execution(* com.*.*.*.dao.*.*(..))|| execution(* com.*.*.*.rvice.impl.*.*(..))|| execution(* com.*.*.*.*.dao.*.*(..))|| execution(* com.*.*.*.*.rvice.impl.*.*(..))|| execution(* com.*.*.*.*.*.dao.*.*(..))|| execution(* com.*.*.*.*.*.rvice.impl.*.*(..))|| execution(* com.*.*.*.*.*.*.dao.*.*(..))|| execution(* com.*.*.*.*.*.*.rvice.impl.*.*(..))|| execution(* com.platform.framework.dao.jpa.badaoimpl.*(..))"/> <aop:around method="exec" pointcut-ref="tranmethod" /> </aop:aspect> </aop:config> <bean id="badao" class="com.platform.framework.dao.jpa.badaoi体恤的意思mpl"> <property name="emf" ref="entitymanagerfactory"/> </bean> </beans>
package com.platform.framework.dao.jpa; import javax.persistence.entitymanager; import javax.persistence.entitymanagerfactory; import javax.persistence.entitytransaction; import org.apache.log4j.logger; import org.aspectj.lang.proceedingjoinpoint; import org.aspectj.lang.signature; /** * @describe jpa事务管理 * @author lry * @since:2014-05-23 * */ public class transactionhandler { private static final logger log = logger .getlogger(transactionhandler.class); private string[] txmethod;// 配置事务的传播特性方法 private entitymanagerfactory entitymanagerfactory;// jpa工厂 public object exec(proceedingjoinpoint point) throws throwable { signature signature = point.getsignature(); log.debug(point.gettarget().getclass().getname() + "." + signature.getname() + "()"); boolean istransaction = fal; for (string method : txmethod) { if (signature.getname().startswith(method)) {// 以method开头的方法打开事务 istransaction = true; break; } } // jpa->hibernate if (point.gettarget() instanceof entitymanagerfactoryproxy) { // 获得被代理对象 entitymanagerfactoryproxy emfp = (entitymanagerfactoryproxy) point .gettarget(); entitymanager em = emfp.getentitymanager(); if (em != null) {// 如果对象已经有em了就不管 return point.proceed(); } el { em = entitymanagerfactory.createentitymanager(); } log.debug("jpa->hibernate open connection..."); if (istransaction) { entitytransaction t = null; try { // 打开连接并开启事务 log.debug("jpa->hibernate begin transaction..."); t = em.gettransaction(); if (!t.isactive()) t.begin(); emfp.tentitymanager(em); object obj = point.proceed(); // 提交事务 log.debug("jpa->hibernate commit..."); t.commit(); return obj; } catch (exception e) { if (t != null) { log.debug("jpa->hibernate error...,rollback..." + e.getmessage()); t.rollback(); } e.printstacktrace(); throw e; } finally { if (em != null && em.isopen()) {// 关闭连接 em.clo(); log.debug("jpa->hibernate clo connection..."); } emfp.tentitymanager(null); } } el { try { emfp.tentitymanager(em); return point.proceed(); } catch (exception e) { log.debug("jpa->hibernate error..." + e.getmessage()); e.printstacktrace(); throw e; } finally { if (em != null && em.isopen()) {// 关闭连接 em.clo(); log.debug("jpa->hibernate clo connection..."); } emfp.tentitymanager(null); } } } el { return point.proceed(); } } public string[] gettxmethod() { return txmethod; } public void ttxmethod(string[] txmethod) { this.txmethod = txmethod; } public void tentitymanagerfactory( entitymanagerfactory entitymanagerfactory) { this.entitymanagerfactory = entitymanagerfactory; } }
package com.platform.framework.dao.jpa; import java.util.collection; import javax.persistence.entitymanager; import javax.persistence.entitymanagerfactory; /** * entitymanager管理器 * * @author:yangjian1004 * @since:2011-11-30 16:14:24 am */ public class entitymanagerfactoryproxy { private static threadlocal<entitymanager> emthreadlocal = new threadlocal<entitymanager>(); private static entitymanagerfactory emf; public void temf(entitymanagerfactory emf) { entitymanagerfactoryproxy.emf = emf; } public static entitymanagerfactory getemf() { return emf; } public entitymanager getentitymanager() { return emthreadlocal.get(); } public void tentitymanager(entitymanager em) { emthreadlocal.t(em); } /** * 创建查询条件 * * @param name * 字段名称 * @param values * 字段值 */ public string createincondition(string name, collection<string> values) { if (values == null || values.size() == 0) { return "1<>1"; } stringbuffer sb = new stringbuffer(); sb.append(name + " in("); for (string id : values) { sb.append("'" + id + "',"); } string hsqlcondition = sb.substring(0, sb.length() - 1) + ")"; return hsqlcondition; } }
package com.platform.framework.dao.jpa; import java.io.rializable; import java.util.arraylist; import java.util.list; /** * page基类<br> * * @describe:分页 */ public class page<t> implements rializable { private static final long rialversionuid = 665620345605746930l; /** 总条数 */ private int count; /** 页码 */ private int pageno; /** 每页显示多少条 */ private int rowsperpage; /** 总页数 */ private int totalpagecount; /** 起始条数 */ private int firstrow; /** 结束条数 */ private int lastrow; /** 查询结果集合形式的结果 */ private list<t> result; /** 查询结果对象形式的结果 */ public object obj; public integer code; // 返回码 private boolean success = true; private string message; public page() { } public page(list<t> list) { this(list.size(), 1, list.size(), list); } public page(int count, int pageno, int rowsperpage, list<t> result) { if (rowsperpage < 1) { rowsperpage = 1; } this.count = count; this.pageno = pageno; this.result = result; this.rowsperpage = rowsperpage; if (this.result == null) this.result = new arraylist<t>(); totalpagecount = count / rowsperpage; if (count - (count / rowsperpage) * rowsperpage > 0) totalpagecount++; if (count == 0) { totalpagecount = 0; pageno = 0; } firstrow = (pageno - 1) * rowsperpage + 1; if (count == 0) { firstrow = 0; } lastrow = (pageno) * rowsperpage; if (lastrow > count) { lastrow = count; } } /** 返回每页的条数 */ public int getcount() { return count; } public list<t> getresult() { return result; } public int getpageno() { return pageno; } /** 返回每页的条数 */ public int getrowsperpage() { return rowsperpage; } /** 返回总的页数 */ public int gettotalpagecount() { return totalpagecount; } public void tpageno(int pageno) { this.pageno = pageno; } public void trowsperpage(int rowsperpage) { this.rowsperpage = rowsperpage; } public int getfirstrow() { return firstrow; } public int getlas春节作文600字trow() { return lastrow; } public void tfirstrow(int firstrow) { this.firstrow = firstrow; } public void tlastrow(int lastrow) { this.lastrow = lastrow; } public void tcount(int count) { this.count = count; } public void ttotalpagecount(int totalpagecount) { this.totalpagecount = totalpagecount; } public void tresult(list<t> result) { this.result = result; } public object getobj() { return obj; } public void tobj(object obj) { this.obj = obj; } public boolean issuccess() { return success; } public void tsuccess(boolean success) { this.success = success; } public string getmessage() { return message; } public void tmessage(string message) { this.message = message; } /** * 计算起始条数 */ public static int calc(int pageno, int rowsperpage, int count) { if (pageno <= 0) pageno = 1; if (rowsperpage <= 0) rowsperpage = 10; // 当把最后一页数据删除以后,页码会停留在最后一个上必须减一 int totalpagecount = count / rowsperpage; if (pageno > totalpagecount && (count % rowsperpage == 0)) { pageno = totalpagecount; } if (pageno - totalpagecount > 2) { pageno = totalpagecount + 1; } int firstrow = (pageno - 1) * rowsperpage; if (firstrow < 0) { firstrow = 0; } return firstrow; } }
package com.platform.framework.dao.jpa; import java.io.rializable; import java.util.list; import javax.persistence.entitymanager; import javax.persistence.criteria.criteriaquery; import javax.persistence.criteria.predicate; import javax.persistence.criteria.lection; import javax.persistence.metamodel.entitytype; import org.apache.log4j.logger; import com.google.common.ba.strings; /** * ibadao接口实现了badaoimpl类<br> */ @suppresswarnings({ "unchecked", "rawtypes" }) public class badaoimpl<t> extends entitymanagerfactoryproxy implements ibadao { private static logger log = logger.getlogger(badaoimpl.class); /** 每次批量操作数 */ private int batchsize = 50; /** 设置每次操作数 */ public void tbatchsize(int batchsize) { this.batchsize = batchsize; } public <e> e get(class clazz, rializable id) { return (e) getentitymanager().find(clazz, id); } /** * 插入记录 * * @param entity * 要插入的记录 */ public void inrt(object entity) { if (entity instanceof list) { inrtlist((list) entity); return; } el if (entity instanceof object[]) { return; } try { getentitymanager().persist(entity); } catch (exception e) { e.printstacktrace(); } } /** * 批量增加 * * @param list * 要新增的数据 */ public void inrtlist(list list) { entitymanager entitymanager = getentitymanager(); if (list == null || list.size() == 0) { return; } int i = 0; for (object o : list) { inrt(o); if (i % batchsize == 0) { entitymanager.flush(); } i++; } log.debug(list.get(0).getclass() + "批量增加数据" + i + "条"); } /** * 更新记录 * * @param entity * 要更新的记录 */ public void update(object entity) { if (entity instanceof list) { this.updatelist((list) entity); return; } getentitymanager().merge(entity); } /** 更新list */ public void updatelist(list list) { for (object entity : list) { this.update(entity); } } /** * 删除记录 * * @param entity * 要删除的记录 */ public void delete(object entity) { if (entity instanceof list) { list list = (list) entity; for (object o : list) { getentitymanager().remove(o); } } el { getentitymanager().remove(entity); } } public <e extends rializable> list<e> query(string jpql) { return getentitymanager().createquery(jpql).getresultlist(); } public integer updatejpql(string jpql) { return getentitymanager().createquery(jpql).executeupdate(); } public integer updatesql(string sql) { return getentitymanager().createnativequery(sql).executeupdate(); } public <e extends rializable> list<e> querybysql(string sql) { return getentitymanager().createnativequery(sql).getresultlist(); } /** * 查询记录 * * @param clazz * 要查询的实体类 * @param hqlcondition * 查询条件 */ public <e extends rializable> list<e> query(class clazz, string hqlcondition) { return getentitymanager().createquery("lect t from " + clazz.getname() + " as t where " + hqlcondition) .getresultlist(); } public void delete(class entity, string jpqlcondition) { if (strings.isnullorempty(jpqlcondition)) { jpqlcondition = "1=1"; } int no = updatejpql("delete " + entity.getname() + " where " + jpqlcondition); log.debug(entity.getname() + "删除" + no + "条数据"); } /** * 根据ids删除数据 * * @param entity * 删除实体类 * @param ids * 删除条件 */ public void delete(class entity, list ids) { string idname = getidname(entity, getentitymanager()); stringbuffer sb = new stringbuffer(); sb.append(idname + " in("); for (int i = 0; i < ids.size(); i++) { sb.append("'" + ids.get(i) + "',"); } string jpqlcondition = sb.substring(0, sb.length() - 1) + ")"; delete(entity, jpqlcondition); } public <e extends rializable> list<e> query(string jpql, int firstresult, int maxresults) { list result = getentitymanager().createquery(jpql).tfirstresult(firstresult).tmaxresults(maxresults) .getresultlist(); return result; } public <e extends rializable> list<e> querybysql(string sql, int firstresult, int maxresults) { return getentitymanager().createnativequery(sql).tfirstresult(firstresult).tmaxresults(maxresults) .getresultlist(); } public <e extends rializable> list<e> queryall(class clazz) { criteriaquery criteriaquery = getentitymanager().getcriteriabuilder().createquery(clazz); criteriaquery.from(clazz); return getentitymanager().createquery(criteriaquery).getresultlist(); } public page querypagebyjpql(string jpql, int pageno, int rowsperpage) { if (pageno <= 0) pageno = 1; if (rowsperpage <= 0) rowsperpage = 7; log.debug("-----开始查询,页码:" + pageno + ",每页显示:" + rowsperpage + "----"); string countjpql = "lect count(*) from (" + jpql + ")"; int count = getcount(countjpql).intvalue(); // 当把最后一页数据删除以后,页码会停留在最后一个上必须减一 int totalpagecount = count / rowsperpage; if (pageno > totalpagecount && (count % rowsperpage == 0)) { pageno = totalpagecount; } if (pageno - totalpagecount > 2) { pageno = totalpagecount + 1; } int firstresult = (pageno - 1) * rowsperpage; if (firstresult < 0) { firstresult = 0; } list result = getentitymanager().createquery(jpql).tfirstresult(firstresult).tmaxresults(rowsperpage) .getresultlist(); return new page(count, pageno, rowsperpage, result); } public long getcount(string jpql) { return (long) getentitymanager().createquery(jpql).getresultlist().get(0); } /*** * * @method updatejpql * @description 根据传入的带有占位符的sql语句, 做增删改操作 例如 * updatejpql("update ur t t t.name=? where t.id=?" * ,{[zhongxiang],[23]}) * @author 钟翔/zhongxiang * @date 2012-8-9 下午3:38:35 * @param jpql * 占位符式的sql * @param paramlist * list里面装有[zhongxiang , 23] */ public void updatejpql(string jpql, list paramlist) { javax.persistence.query query = getentitymanager().createquery(jpql); for (int i = 0; i < paramlist.size(); i++) { query.tparameter(i + 1, paramlist.get(i)); } query.executeupdate(); } /** * 统计记录 * * @param query * 统计条件 */ public long getcount(query query) { lection lection = query.getcriteriaquery().getlection(); query.getcriteriaquery().lect(query.getcriteriabuilder().count(query.getfrom())); long count = (long) getentitymanager().createquery(query.newcriteriaquery()).getresultlist().get(0); query.getcriteriaquery().lect(lection); return count; } /** * 分页查询 * * @param query * 查询条件 * @param pageno * 页号 * @param rowsperpage * 每页显示条数 */ public page querypage(query query, int pageno, int rowsperpage) { if (pageno <= 0) pageno = 1; if (rowsperpage <= 0) rowsperpage = 7; log.debug(query.getclazz() + "-----开始查询,页码:" + pageno + ",每页显示:" + rowsperpage + "----"); log.debug("查询条件:"); for (predicate cri : query.getpredicates()) log.debug(cri); int count = getcount(query).intvalue(); // 当把最后一页数据删除以后,页码会停留在最后一个上必须减一 int totalpagecount = count / rowsperpage; if (pageno > totalpagecount && (count % rowsperpage == 0)) { pageno = totalpagecount; } if (pageno - totalpagecount > 2) { pageno = totalpagecount + 1; } int firstresult = (pageno - 1) * rowsperpage; if (firstresult < 0) { firstresult = 0; } list result = getentitymanager().createquery(query.newcriteriaquery()).tfirstresult(firstresult) .tmaxresults(rowsperpage).getresultlist(); return new page(count, pageno, rowsperpage, result); } /** * 根据query查找记录 * * @param query * 查询条件 * @param firstresult * 起始行 * @param maxresults * 结束行 */ public <e extends rializable> list<e> query(query query, int firstresult, int maxresults) { list result = getentitymanager().createquery(query.newcriteriaquery()).tfirstresult(firstresult) .tmaxresults(maxresults).getresultlist(); return result; } /** * 根据query查找记录 * * @param query * 查询条件 */ public <e extends rializable> list<e> query(query query) { return getentitymanager().createquery(query.newcriteriaquery()).getresultlist(); } /** * 获得主键名称 * * @param clazz * 操作是实体对象 * @param entitymanager * jpa的entitymanager工厂 * @return 初建名称 * */ public static string getidname(class clazz, entitymanager entitymanager) { entitytype entitytype = entitymanager.getmetamodel().entity(clazz); return entitytype.getid(entitytype.getidtype().getjavatype()).getname(); } }
package com.platform.framework.dao.jpa; import java.io.rializable; import java.util.list; import javax.persistence.entitymanager; /** * ibadao基类<br> * * @describe:系统基础jpa dao接口 */ @suppresswarnings({ "rawtypes" }) public interface ibadao { public entitymanager getentitymanager(); public <e> e get(class clazz, rializable id); /** * 插入记录 * * @param entity * 要插入的记录 */ public void inrt(object entity); /** * 更新记录 * * @param entity * 要更新的记录 */ public void update(object entity); /** 更新list */ public void updatelist(list list); /** * 删除记录 * * @param entity * 要删除的记录 */ public void delete(object entity); /** * 删除记录 * * @param entity * 要删除的记录 */ public void delete(class entity, list ids); /** * 删除记录 * * @param entity * 要删除的记录 */ public void delete(class entity, string jpqlcondition); /** * 统计记录 * * @param query * 统计条件 */ public long getcount(query query); public long getcount(string jpql); /** * 分页查询 * * @param query * 查询条件 * @param pageno * 页号 * @param rowsperpage * 每页显示条数 */ public page querypage(query query, int pageno, int rowsperpage); /** * 根据query查找记录 * * @param query * 查询条件 * @param firstresult * 起始行 * @param maxresults * 结束行 */ public <e extends rializable> list<e> query(query query, int firstresult, int maxresults); /** * 根据query查找记录 * * @param query * 查询条件 */ public <e extends rializable> list<e> query(query query); /** * 执行更新操作的jpql语句 * * @param jpql * 要执行的jpql语句 */ public <e extends rializable> list<e> query(string jpql); public <e extends rializable> list<e> queryall(class clazz); public <e extends rializable> list<e> query(string jpql, int firstresult, int maxresults); /** * 执行查询操作的sql语句 * * @param sql * 要执行的sql语句 */ public <e extends rializable> list<e> querybysql(string sql); public <e extends rializable> list<e> querybysql(string sql, int firstresult, int maxresults); /** * 查询记录 * * @param clazz * 要查询的实体类 * @param hqlcondition * 查询条件 */ public <e extends rializable> list<e> query(class clazz, string hqlcondition); /** * 执行更新操作的sql语句 * * @param sql * 要执行的sql语句 */ public integer updatesql(string sql); public integer updatejpql(string jpql); public page querypagebyjpql(string hql, int pageno, int rowsperpage); public void updatejpql(string jpql, list paramlist); }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持www.887551.com。
本文发布于:2023-04-04 03:51:54,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/e1f2d58ea103f69047540708bf57485f.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:JPA 使用criteria简单查询工具类方式.doc
本文 PDF 下载地址:JPA 使用criteria简单查询工具类方式.pdf
留言与评论(共有 0 条评论) |