文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何使用JPA进行CriteriaQuery进行查询

2023-06-21 23:22

关注

本篇内容介绍了“如何使用JPA进行CriteriaQuery进行查询”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

使用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; @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));} 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));} 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));} 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);} public void le(String propertyName, Number value) {if (isNullOrEmpty(value)) {return;}this.predicates.add(criteriaBuilder.le(from.get(propertyName), value));} public void lt(String propertyName, Number value) {if (isNullOrEmpty(value)) {return;}this.predicates.add(criteriaBuilder.lt(from.get(propertyName), value));} public void ge(String propertyName, Number value) {if (isNullOrEmpty(value)) {return;}this.predicates.add(criteriaBuilder.ge(from.get(propertyName), value));} public void gt(String propertyName, Number value) {if (isNullOrEmpty(value)) {return;}this.predicates.add(criteriaBuilder.gt(from.get(propertyName), 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);} public void addCriterions(Predicate predicate) {this.predicates.add(predicate);} 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.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.1.xsd            http://www.springframework.org/schema/aop             http://www.springframework.org/schema/aop/spring-aop.xsdhttp://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; 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->Hibernateif (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; 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);} 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; 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;@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);} 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();}} 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 + "条");} public void update(Object entity) {if (entity instanceof List) {this.updateList((List) entity);return;}getEntityManager().merge(entity);} public void updateList(List list) {for (Object entity : list) {this.update(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();} 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 + "条数据");} 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);} 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();} 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;} 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);} 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;} public <E extends Serializable> List<E> query(Query query) {return getEntityManager().createQuery(query.newCriteriaQuery()).getResultList();}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; @SuppressWarnings({ "rawtypes" })public interface IBaseDao {public EntityManager getEntityManager(); public <E> E get(Class clazz, Serializable id); public void insert(Object entity); public void update(Object entity); public void updateList(List list); public void delete(Object entity); public void delete(Class entity, List ids); public void delete(Class entity, String jpqlCondition); public Long getCount(Query query); public Long getCount(String jpql); public Page queryPage(Query query, int pageNo, int rowsPerPage); public <E extends Serializable> List<E> query(Query query, int firstResult, int maxResults); public <E extends Serializable> List<E> query(Query query); 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); public <E extends Serializable> List<E> queryBySql(String sql); public <E extends Serializable> List<E> queryBySql(String sql, int firstResult, int maxResults); public <E extends Serializable> List<E> query(Class clazz, String hqlCondition); 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); }

“如何使用JPA进行CriteriaQuery进行查询”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯