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