目录
- 使用jpa criteriaquery查询的注意事项
- 1.pojo类
- service层
- 查询方法
- 封装jpa动态查询(criteriaquery)
- entitymanager管理器,通过spring管理
- page分页和结果封装类
- ibasedao接口实现了basedaoimpl
- ibasedao接口
使用jpa criteriaquery查询的注意事项
1.pojo类
@entity
@table(name = "report_workload")
@jsonignoreproperties({"hibernatelazyinitializer", "handler"})
@jsonidentityinfo(generator = jsoggenerator.class)
public class reportworkload {
private int id;
private integer flowworkitemapprid;
private integer busid;
private integer deptid;
private integer staffid;
private integer busivalueindustryid;
private integer busivaluescaleid;
private string taskname;
private integer count;
private bigdecimal amount;
private date approvaltime;
private string reporttime;
private string deptname;
private string staffname;
@id
@column(name = "id")
@generatedvalue(strategy = generationtype.auto)
public int getid() {
return id;
}
public void setid(int id) {
this.id = id;
}
@basic
@column(name = "flow_work_item_appr_id")
public integer getflowworkitemapprid() {
return flowworkitemapprid;
}
public void setflowworkitemapprid(integer flowworkitemapprid) {
this.flowworkitemapprid = flowworkitemapprid;
}
@basic
@column(name = "bus_id")
public integer getbusid() {
return busid;
}
public void setbusid(integer busid) {
this.busid = busid;
}
@basic
@column(name = "dept_id")
public integer getdeptid() {
return deptid;
}
public void setdeptid(integer deptid) {
this.deptid = deptid;
}
@basic
@column(name = "staff_id")
public integer getstaffid() {
return staffid;
}
public void setstaffid(integer staffid) {
this.staffid = staffid;
}
@basic
@column(name = "busi_value_industry_id")
public integer getbusivalueindustryid() {
return busivalueindustryid;
}
public void setbusivalueindustryid(integer busivalueindustryid) {
this.busivalueindustryid = busivalueindustryid;
}
@basic
@column(name = "busi_value_scale_id")
public integer getbusivaluescaleid() {
return busivaluescaleid;
}
public void setbusivaluescaleid(integer busivaluescaleid) {
this.busivaluescaleid = busivaluescaleid;
}
@basic
@column(name = "task_name")
public string gettaskname() {
return taskname;
}
public void settaskname(string taskname) {
this.taskname = taskname;
}
@basic
@column(name = "count")
public integer getcount() {
return count;
}
public void setcount(integer count) {
this.count = count;
}
@basic
@column(name = "amount")
public bigdecimal getamount() {
return amount;
}
public void setamount(bigdecimal amount) {
this.amount = amount;
}
@basic
@column(name = "approval_time")
public date getapprovaltime() {
return approvaltime;
}
public void setapprovaltime(date approvaltime) {
this.approvaltime = approvaltime;
}
@basic
@column(name = "report_time")
public string getreporttime() {
return reporttime;
}
public void setreporttime(string reporttime) {
this.reporttime = reporttime;
}
@transient
public string getdeptname() {
return deptname;
}
public void setdeptname(string deptname) {
this.deptname = deptname;
}
@transient
public string getstaffname() {
return staffname;
}
public void setstaffname(string staffname) {
this.staffname = staffname;
}
@override
public boolean equals(object o) {
if (this == o) return true;
if (!(o instanceof reportworkload)) return false;
reportworkload that = (reportworkload) o;
return id == that.id;
}
@override
public int hashcode() {
return id;
}
public reportworkload(int id, integer flowworkitemapprid,
integer busid, integer deptid, integer staffid,
integer busivalueindustryid, integer busivaluescaleid,
string taskname, long count, bigdecimal amount,
date approvaltime, string reporttime) {
this.id = id;
this.flowworkitemapprid = flowworkitemapprid;
this.busid = busid;
this.deptid = deptid;
this.staffid = staffid;
this.busivalueindustryid = busivalueindustryid;
this.busivaluescaleid = busivaluescaleid;
this.taskname = taskname;
this.count = integer.parseint(count+"");
// this.count = count;
this.amount = amount;
this.approvaltime = approvaltime;
this.reporttime = reporttime;
}
public reportworkload() {
}
}
在进行聚合函数sum求和时,原来是int会自动提升为long,不做特殊处理就会报以下错误了:
org.hibernate.hql.internal.ast.detailedsemanticexception: unable to locate appropriate constructor on class [com.changfa.frame.data.entity.report.report workload]. expected arguments are: int, int, int, int, int, int, int, java.lang.string, long, java.math.bigdecimal, java.util.date, java.lang.string at org.hibernate.hql.internal.ast.tree.constructornode.resolveconstructor(constructornode.java:182) at org.hibernate.hql.internal.ast.tree.constructornode.prepare(constructornode.java:144) at org.hibernate.hql.internal.ast.hqlsqlwalker.processconstructor(hqlsqlwalker.java:1092) at org.hibernate.hql.internal.antlr.hqlsqlbasewalker.selectexpr(hqlsqlbasewalker.java:2359)
会提示你查询数据库返回的类型和你的构造函数类型对应不上。
service层
通过注解将entitymanager加载进来:
@persistencecontext private entitymanager em;
查询方法
public list<reportworkload> reportworkloadsearch(string reporttime, string deptid, string staffid, string typeid, string industryid) {
list<reportworkload> reportworkloadlist = new arraylist<>();
criteriabuilder criteriabuilder = em.getcriteriabuilder();
criteriaquery<reportworkload> cq = criteriabuilder.createquery(reportworkload.class);
root<reportworkload> rt = cq.from(reportworkload.class);
cq.multiselect(rt.get("id"),rt.get("flowworkitemapprid"),
rt.get("busid"),rt.get("deptid"),rt.get("staffid"),
rt.get("busivalueindustryid"),rt.get("busivaluescaleid"),
rt.get("taskname"),criteriabuilder.sum(rt.get("count")),
criteriabuilder.sum(rt.get("amount")),rt.get("approvaltime"),
rt.get("reporttime"));
if(reporttime!=null&&reporttime!=""){
cq.where(criteriabuilder.equal(rt.get("reporttime"), reporttime));
}
if(deptid!=null&&deptid!=""){
cq.where(criteriabuilder.equal(rt.get("deptid"), integer.parseint(deptid)));
}
if(staffid!=null&&staffid!=""){
cq.where(criteriabuilder.equal(rt.get("staffid"), integer.parseint(staffid)));
}
if(typeid!=null&&typeid!=""){
cq.where(criteriabuilder.equal(rt.get("typeid"), integer.parseint(typeid)));
}
if(industryid!=null&&industryid!=""){
cq.where(criteriabuilder.equal(rt.get("industryid"), integer.parseint(industryid)));
}
cq.groupby(rt.get("busid"),rt.get("deptid"),rt.get("taskname"));
reportworkloadlist = em.createquery(cq).getresultlist();
return reportworkloadlist;
}
在进行cq.multiselect自定义返回字段时,必须在对应的pojo中给一个对应的返回字段构造函数
封装jpa动态查询(criteriaquery)
jpa动态查询(criteriaquery)封装的一段代码:
package com.platform.framework.dao.jpa;
import java.io.serializable;
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({ "unused", "unchecked", "rawtypes", "null", "hiding" })
public class query implements serializable {
private static final long serialversionuid = 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.keyset().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.equalsignorecase("asc"))
this.orders.add(criteriabuilder.asc(from.get(propertyname)));
else if (order.equalsignorecase("desc"))
this.orders.add(criteriabuilder.desc(from.get(propertyname)));
}
public void setorder(string propertyname, string order) {
this.orders = null;
addorder(propertyname, order);
}
public class getmodleclass() {
return this.clazz;
}
public string getprojection() {
return this.projection;
}
public void setprojection(string projection) {
this.projection = projection;
}
public class getclazz() {
return this.clazz;
}
public list<order> getorders() {
return orders;
}
public void setorders(list<order> orders) {
this.orders = orders;
}
public entitymanager getentitymanager() {
return this.entitymanager;
}
public void setentitymanager(entitymanager em) {
this.entitymanager = em;
}
public root getfrom() {
return from;
}
public list<predicate> getpredicates() {
return predicates;
}
public void setpredicates(list<predicate> predicates) {
this.predicates = predicates;
}
public criteriaquery getcriteriaquery() {
return criteriaquery;
}
public criteriabuilder getcriteriabuilder() {
return criteriabuilder;
}
public void setfetchmodes(list<string> fetchfield, list<string> fetchmode) {
}
public string getgroupby() {
return groupby;
}
public void setgroupby(string groupby) {
this.groupby = groupby;
}
}
<?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemalocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/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="false" /> <entry key="hibernate.show_sql" value="false" /> <entry key="hibernate.current_session_context_class" value="org.hibernate.context.internal.threadlocalsessioncontext"/> <entry key="hibernate.dialect" value="org.hibernate.dialect.mysqldialect" /> <!-- to enable hibernate's second level cache and query cache settings --> <entry key="hibernate.max_fetch_depth" value="4" /> <entry key="hibernate.cache.use_second_level_cache" value="true" /> <entry key="hibernate.cache.use_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:database="mysql" p:showsql="true" p:generateddl="true" p:databaseplatform="org.hibernate.dialect.mysqldialect" /> <bean id="transactionhandler" class="com.platform.framework.dao.jpa.transactionhandler" > <property name="txmethod"> <list> <value>insert</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.*.service.impl.*.*(..))|| execution(* com.*.*.dao.*.*(..))|| execution(* com.*.*.service.impl.*.*(..))|| execution(* com.*.*.*.dao.*.*(..))|| execution(* com.*.*.*.service.impl.*.*(..))|| execution(* com.*.*.*.*.dao.*.*(..))|| execution(* com.*.*.*.*.service.impl.*.*(..))|| execution(* com.*.*.*.*.*.dao.*.*(..))|| execution(* com.*.*.*.*.*.service.impl.*.*(..))|| execution(* com.*.*.*.*.*.*.dao.*.*(..))|| execution(* com.*.*.*.*.*.*.service.impl.*.*(..))|| execution(* com.platform.framework.dao.jpa.basedaoimpl.*(..))"/> <aop:around method="exec" pointcut-ref="tranmethod" /> </aop:aspect> </aop:config> <bean id="basedao" class="com.platform.framework.dao.jpa.basedaoimpl"> <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 = false;
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();
} else {
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.setentitymanager(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.close();
log.debug("jpa->hibernate close connection...");
}
emfp.setentitymanager(null);
}
} else {
try {
emfp.setentitymanager(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.close();
log.debug("jpa->hibernate close connection...");
}
emfp.setentitymanager(null);
}
}
} else {
return point.proceed();
}
}
public string[] gettxmethod() {
return txmethod;
}
public void settxmethod(string[] txmethod) {
this.txmethod = txmethod;
}
public void setentitymanagerfactory(
entitymanagerfactory entitymanagerfactory) {
this.entitymanagerfactory = entitymanagerfactory;
}
}
entitymanager管理器,通过spring管理
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 setemf(entitymanagerfactory emf) {
entitymanagerfactoryproxy.emf = emf;
}
public static entitymanagerfactory getemf() {
return emf;
}
public entitymanager getentitymanager() {
return emthreadlocal.get();
}
public void setentitymanager(entitymanager em) {
emthreadlocal.set(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;
}
}
page分页和结果封装类
package com.platform.framework.dao.jpa;
import java.io.serializable;
import java.util.arraylist;
import java.util.list;
/**
* page基类<br>
*
* @describe:分页
*/
public class page<t> implements serializable {
private static final long serialversionuid = 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 setpageno(int pageno) {
this.pageno = pageno;
}
public void setrowsperpage(int rowsperpage) {
this.rowsperpage = rowsperpage;
}
public int getfirstrow() {
return firstrow;
}
public int getlastrow() {
return lastrow;
}
public void setfirstrow(int firstrow) {
this.firstrow = firstrow;
}
public void setlastrow(int lastrow) {
this.lastrow = lastrow;
}
public void setcount(int count) {
this.count = count;
}
public void settotalpagecount(int totalpagecount) {
this.totalpagecount = totalpagecount;
}
public void setresult(list<t> result) {
this.result = result;
}
public object getobj() {
return obj;
}
public void setobj(object obj) {
this.obj = obj;
}
public boolean issuccess() {
return success;
}
public void setsuccess(boolean success) {
this.success = success;
}
public string getmessage() {
return message;
}
public void setmessage(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;
}
}
ibasedao接口实现了basedaoimpl
package com.platform.framework.dao.jpa;
import java.io.serializable;
import java.util.list;
import javax.persistence.entitymanager;
import javax.persistence.criteria.criteriaquery;
import javax.persistence.criteria.predicate;
import javax.persistence.criteria.selection;
import javax.persistence.metamodel.entitytype;
import org.apache.log4j.logger;
import com.google.common.base.strings;
/**
* ibasedao接口实现了basedaoimpl类<br>
*/
@suppresswarnings({ "unchecked", "rawtypes" })
public class basedaoimpl<t> extends entitymanagerfactoryproxy implements ibasedao {
private static logger log = logger.getlogger(basedaoimpl.class);
/** 每次批量操作数 */
private int batchsize = 50;
/** 设置每次操作数 */
public void setbatchsize(int batchsize) {
this.batchsize = batchsize;
}
public <e> e get(class clazz, serializable id) {
return (e) getentitymanager().find(clazz, id);
}
/**
* 插入记录
*
* @param entity
* 要插入的记录
*/
public void insert(object entity) {
if (entity instanceof list) {
insertlist((list) entity);
return;
} else if (entity instanceof object[]) {
return;
}
try {
getentitymanager().persist(entity);
} catch (exception e) {
e.printstacktrace();
}
}
/**
* 批量增加
*
* @param list
* 要新增的数据
*/
public void insertlist(list list) {
entitymanager entitymanager = getentitymanager();
if (list == null || list.size() == 0) {
return;
}
int i = 0;
for (object o : list) {
insert(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);
}
} else {
getentitymanager().remove(entity);
}
}
public <e extends serializable> 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 serializable> list<e> querybysql(string sql) {
return getentitymanager().createnativequery(sql).getresultlist();
}
/**
* 查询记录
*
* @param clazz
* 要查询的实体类
* @param hqlcondition
* 查询条件
*/
public <e extends serializable> list<e> query(class clazz, string hqlcondition) {
return getentitymanager().createquery("select 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 serializable> list<e> query(string jpql, int firstresult, int maxresults) {
list result = getentitymanager().createquery(jpql).setfirstresult(firstresult).setmaxresults(maxresults)
.getresultlist();
return result;
}
public <e extends serializable> list<e> querybysql(string sql, int firstresult, int maxresults) {
return getentitymanager().createnativequery(sql).setfirstresult(firstresult).setmaxresults(maxresults)
.getresultlist();
}
public <e extends serializable> 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 = "select 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).setfirstresult(firstresult).setmaxresults(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 user t set 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.setparameter(i + 1, paramlist.get(i));
}
query.executeupdate();
}
/**
* 统计记录
*
* @param query
* 统计条件
*/
public long getcount(query query) {
selection selection = query.getcriteriaquery().getselection();
query.getcriteriaquery().select(query.getcriteriabuilder().count(query.getfrom()));
long count = (long) getentitymanager().createquery(query.newcriteriaquery()).getresultlist().get(0);
query.getcriteriaquery().select(selection);
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()).setfirstresult(firstresult)
.setmaxresults(rowsperpage).getresultlist();
return new page(count, pageno, rowsperpage, result);
}
/**
* 根据query查找记录
*
* @param query
* 查询条件
* @param firstresult
* 起始行
* @param maxresults
* 结束行
*/
public <e extends serializable> list<e> query(query query, int firstresult, int maxresults) {
list result = getentitymanager().createquery(query.newcriteriaquery()).setfirstresult(firstresult)
.setmaxresults(maxresults).getresultlist();
return result;
}
/**
* 根据query查找记录
*
* @param query
* 查询条件
*/
public <e extends serializable> 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();
}
}
ibasedao接口
package com.platform.framework.dao.jpa;
import java.io.serializable;
import java.util.list;
import javax.persistence.entitymanager;
/**
* ibasedao基类<br>
*
* @describe:系统基础jpa dao接口
*/
@suppresswarnings({ "rawtypes" })
public interface ibasedao {
public entitymanager getentitymanager();
public <e> e get(class clazz, serializable id);
/**
* 插入记录
*
* @param entity
* 要插入的记录
*/
public void insert(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 serializable> list<e> query(query query, int firstresult, int maxresults);
/**
* 根据query查找记录
*
* @param query
* 查询条件
*/
public <e extends serializable> list<e> query(query query);
/**
* 执行更新操作的jpql语句
*
* @param jpql
* 要执行的jpql语句
*/
public <e extends serializable> list<e> query(string jpql);
public <e extends serializable> list<e> queryall(class clazz);
public <e extends serializable> list<e> query(string jpql, int firstresult, int maxresults);
/**
* 执行查询操作的sql语句
*
* @param sql
* 要执行的sql语句
*/
public <e extends serializable> list<e> querybysql(string sql);
public <e extends serializable> list<e> querybysql(string sql, int firstresult, int maxresults);
/**
* 查询记录
*
* @param clazz
* 要查询的实体类
* @param hqlcondition
* 查询条件
*/
public <e extends serializable> 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。