背景:
在SpringBoot JPA项目中,一张表对应一个Repository太繁琐,就写了这些通用查询、保存方法提升开发效率;
运行环境:
SpringBoot版本:2.1.16.RELEASE
Hibernate Core版本:5.3.17.Final
Spring版本:5.1.17.RELEASE
代码:
是用EntityManagerFactory和EntityManager编写通用查询方法
import org.hibernate.FlushMode; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.transform.Transformers; import org.springframework.stereotype.Service; import javax.persistence.*; import java.util.List; import java.util.Map; /** * 基础业务层 */ @SuppressWarnings("all") @Service public class BaseService { @PersistenceUnit private EntityManagerFactory emf; @PersistenceContext private EntityManager entityManager; /** * 方法描述:获取session连接对象 * @return */ public Session getSession() { //EntityManager entityManager = emf.createEntityManager(); //Session session = entityManager.unwrap(Session.class); //Session session = emf.unwrap(Session.class); Session session = emf.unwrap(SessionFactory.class).openSession(); return session; } /** * 方法描述:获取当前session * @return */ public Session getCurrentSession() { Session session = (Session) entityManager.getDelegate(); session.setFlushMode(FlushMode.MANUAL); return session; } /** * 方法描述:获取事务(不能使用) * @return */ public EntityTransaction getTransaction1() { EntityTransaction transaction = entityManager.getTransaction(); return transaction; } /** * 方法描述:获取事务(不能使用) * @return */ public EntityTransaction getTransaction() { //EntityManager entityManager = emf.createEntityManager(); //return entityManager.getTransaction(); Transaction transaction = getSession().getTransaction(); return transaction; } /** * 方法描述:根据原生sql和参数集合查询出Map集合 * @param sql 原生SQL * @param params 参数集合(占位符->参数) * @return */ public List<Map<String, Object>> select(String sql, Map<String, Object> params) { Query query = emf.createEntityManager().createNativeQuery(sql); if(!params.isEmpty()) { params.forEach((k,v) -> { query.setParameter(k, v); }); } query.unwrap(org.hibernate.SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); List<Map<String, Object>> resultList = query.getResultList(); return resultList; } /** * 方法描述:根据原生SQL和参数集合查询出Map集合 * @param sql 原生SQL * @param params 参数集合(下标->参数) * @return */ public List<Map<String, Object>> select1(String sql, Map<Integer, Object> params) { Query query = emf.createEntityManager().createNativeQuery(sql); if(!params.isEmpty()) { params.forEach((k,v) -> { query.setParameter(k, v); }); } query.unwrap(org.hibernate.SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); List<Map<String, Object>> resultList = query.getResultList(); return resultList; } /** * 方法描述:根据原生sql和参数集合查询出List<aClass>集合 * @param sql 原生SQL * @param params 参数集合(占位符->参数) * @return */ public List select_1(String sql, Class aClass, Map<String, Object> params) { Query query = emf.createEntityManager().createNativeQuery(sql, aClass); if(!params.isEmpty()) { params.forEach((k,v) -> { query.setParameter(k, v); }); } return query.getResultList(); } /** * 方法描述:根据原生SQL和参数集合查询出List<aClass>集合 * @param sql 原生SQL * @param params 参数集合(下标->参数) * @return */ public List select1_1(String sql, Class aClass, Map<Integer, Object> params) { Query query = emf.createEntityManager().createNativeQuery(sql, aClass); if(!params.isEmpty()) { params.forEach((k,v) -> { query.setParameter(k, v); }); } return query.getResultList(); } /** * 方法描述:根据原生SQL和参数集合查询出List<Object[]>集合 * @param sql 原生SQL * @param params 参数集合(占位符->参数) * @return */ public List<Object[]> select2(String sql, Map<String, Object> params) { Query query = emf.createEntityManager().createNativeQuery(sql); if(!params.isEmpty()) { params.forEach((k,v) -> { query.setParameter(k, v); }); } List<Object[]> resultList = query.getResultList(); return resultList; } /** * 方法描述:根据原生SQL和参数集合查询出List<Object[]>集合 * @param sql 原生SQL * @param params 参数集合(下标->参数) * @return */ public List<Object[]> select3(String sql, Map<Integer, Object> params) { Query query = emf.createEntityManager().createNativeQuery(sql); if(!params.isEmpty()) { params.forEach((k,v) -> { query.setParameter(k, v); }); } List<Object[]> resultList = query.getResultList(); return resultList; } /** * 方法描述:根据原生SQL和参数集合查询出List集合 * @param sql 原生SQL * @param params 参数集合(占位符->参数) * @return */ public List select4(String sql, Map<String, Object> params) { Query query = emf.createEntityManager().createNativeQuery(sql); if(!params.isEmpty()) { params.forEach((k,v) -> { query.setParameter(k, v); }); } List resultList = query.getResultList(); return resultList; } /** * 方法描述:根据原生SQL和参数集合查询出List集合 * @param sql 原生SQL * @param params 参数集合(下标->参数) * @return */ public List select5(String sql, Map<Integer, Object> params) { Query query = emf.createEntityManager().createNativeQuery(sql); if(!params.isEmpty()) { params.forEach((k,v) -> { query.setParameter(k, v); }); } List resultList = query.getResultList(); return resultList; } /** * 方法描述:根据原生SQL和参数集合查询唯一数据(必须查询全部数据) * @param sql 原生SQL * @param params 参数集合(占位符->参数) * @return */ public Object select6(String sql, Map<String, Object> params) { Query query = emf.createEntityManager().createNativeQuery(sql); if(!params.isEmpty()) { params.forEach((k,v) -> { query.setParameter(k, v); }); } return query.getSingleResult(); } /** * 方法描述:根据原生SQL和参数集合查询唯一数据(必须查询全部数据) * @param sql 原生SQL * @param aClass 转换类型 * @param params 参数集合(占位符->参数) * @return */ public Object select6_1(String sql, Class aClass, Map<String, Object> params) { Query query = emf.createEntityManager().createNativeQuery(sql, aClass); if(!params.isEmpty()) { params.forEach((k,v) -> { query.setParameter(k, v); }); } return query.getSingleResult(); } /** * 方法描述:根据HSQL和参数集合查询数据集合 * @param hql HQL * @param params (占位符->参数) * @return */ public List selectAll7(String hsql, Map<String, Object> params) { Query query = emf.createEntityManager().createQuery(hsql); if(!params.isEmpty()) { params.forEach((k,v) -> { query.setParameter(k, v); }); } List resultList = query.getResultList(); return resultList; } /** * 方法描述:根据HSQL和参数集合查询数据集合 * @param hql HQL * @param params (下标->参数) * @return */ public List selectAll7_1(String hsql, Map<Integer, Object> params) { Query query = emf.createEntityManager().createQuery(hsql); if(!params.isEmpty()) { params.forEach((k,v) -> { query.setParameter(k, v); }); } List resultList = query.getResultList(); return resultList; } /** * 方法描述:根据HSQL和参数集合查询数据集合 * @param hql HQL * @param aClass 转化类型 * @param params 参数集合(占位符->参数) * @return */ public List selectAll7(String hsql, Class aClass, Map<String, Object> params) { Query query = emf.createEntityManager().createQuery(hsql, aClass); if(!params.isEmpty()) { params.forEach((k,v) -> { query.setParameter(k, v); }); } List resultList = query.getResultList(); return resultList; } /** * 方法描述:根据HSQL和参数集合查询数据集合 * @param hql HQL * @param aClass 转化类型 * @param params 参数集合(下标->参数) * @return */ public List selectAll7_1(String hsql, Class aClass, Map<Integer, Object> params) { Query query = emf.createEntityManager().createQuery(hsql, aClass); if(!params.isEmpty()) { params.forEach((k,v) -> { query.setParameter(k, v); }); } List resultList = query.getResultList(); return resultList; } /** * 方法描述:根据HSQL和参数集合查询Map集合(没有这个方法) * @param hql HQL * @param aClass 转化类型 * @param params 参数集合(下标->参数) * @return */ // public List<Map<String, Object>> selectAll8(String hsql, Map<String, Object> params) { // Query query = emf.createEntityManager().createQuery(hsql); // if(!params.isEmpty()) { // params.forEach((k,v) -> { // query.setParameter(k, v); // }); // } // query.unwrap(org.hibernate.SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); // return query.getResultList(); // } /** * 根据HQL和参数集合查询单条数据 * @param hql HQL * @param params 参数集合(占位符->参数) * @return */ public Object select8(String hsql, Map<String, Object> params) { Query query = emf.createEntityManager().createQuery(hsql); if(!params.isEmpty()) { params.forEach((k,v) -> { query.setParameter(k, v); }); } return query.getSingleResult(); } /** * 根据HQL和参数集合查询单条数据 * @param hql HQL * @param params 参数集合(下标->参数) * @return */ public Object select8_1(String hsql, Map<Integer, Object> params) { Query query = emf.createEntityManager().createQuery(hsql); if(!params.isEmpty()) { params.forEach((k,v) -> { query.setParameter(k, v); }); } return query.getSingleResult(); } /** * 保存全部数据 * @param dataList */ public void saveAll(List dataList) { EntityManager entityManager = emf.createEntityManager(); Session session = (Session)entityManager.getDelegate(); EntityTransaction transaction = entityManager.getTransaction(); try { transaction.begin(); dataList.forEach(data -> { session.save(data); }); session.flush(); session.clear(); transaction.commit(); } finally { this.entityManager.close(); } } }
继承JpaRepository和JpaSpecificationExecutor接口实现的多条件查询:
前提:继承JpaRepository和JpaSpecificationExecutor接口
public Map<String, Object> select(Map<String, Object> params) { Sort sort = new Sort(Sort.Direction.DESC, "createTime"); List<Employ> employList = employRepository.findAll(new Specification<Employ>() { @Override public Predicate toPredicate(Root<Employ> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) { List<Predicate> condition = new ArrayList<Predicate>(); condition.add(criteriaBuilder.equal(root.get("isDelete").as(Integer.class), 0)); condition.add(criteriaBuilder.equal(root.get("isActive").as(Integer.class), 0)); // 编号 if (Objects.nonNull(params.get("code"))) { condition.add(criteriaBuilder.equal(root.get("code").as(String.class), params.get("code").toString())); } // 名称 if (Objects.nonNull(params.get("name"))) { condition.add(criteriaBuilder.equal(root.get("name").as(String.class), params.get("name").toString())); } // 开始、结束时间 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); if (Objects.nonNull(params.get("beginTime")) && Objects.nonNull(params.get("endTime"))) { // 开始时间和结束时间之内 String beginTime = params.get("beginTime").toString() + " 00:00:00"; String endTime = params.get("endTime").toString() + " 23:59:59"; condition.add(criteriaBuilder.between(root.<LocalDateTime>get("createTime"), LocalDateTime.parse(beginTime, formatter), LocalDateTime.parse(endTime, formatter))); }else if(Objects.nonNull(params.get("beginTime"))) { // 大于开始时间 String beginTime = params.get("beginTime").toString() + " 00:00:00"; condition.add(criteriaBuilder.greaterThanOrEqualTo(root.<LocalDateTime>get("createTime"), LocalDateTime.parse(beginTime, formatter))); }else if(Objects.nonNull(params.get("endTime"))) { // 小于结束时间 String beginTime = params.get("endTime").toString() + " 23:59:59"; condition.add(criteriaBuilder.lessThanOrEqualTo(root.<LocalDateTime>get("createTime"), LocalDateTime.parse(beginTime, formatter))); } Predicate[] p = new Predicate[condition.size()]; return criteriaBuilder.and(condition.toArray(p)); } }, sort); Map<String, Object> result = new HashMap<>(); result.put("data", employList); result.put("total", employList.size()); return result; }
原文:https://www.cnblogs.com/mxh-java/p/14640851.html