JPA多表多条件查询解决思路

柔光的暖阳◎ 2023-07-07 12:50 15阅读 0赞

JPA单表多条件查询

可以在Service层使用Predicate实现
ServiceImpl实现类,查询条件可以自定义

  1. @Override
  2. public Page<OrgInfo> findOrgByCondition(OrgParam orgParam, Pageable pageable)
  3. {
  4. return orgRepository.findAll((root, query, cb) -> {
  5. List<Predicate> predicates = new ArrayList<>();
  6. if (!StringUtils.isEmpty(orgParam.getFlag())){
  7. predicates.add(cb.equal(root.get("flag"),orgParam.getFlag()));
  8. }
  9. if (!StringUtils.isEmpty(orgParam.getParentId())){
  10. predicates.add(cb.equal(root.get("parentId"),orgParam.getParentId()));
  11. }
  12. if (!StringUtils.isEmpty(orgParam.getName())){
  13. predicates.add(cb.like(root.get("name"),orgParam.getName()+"%"));
  14. }
  15. if (orgParam.getMinSeqno()!=null && orgParam.getMaxSeqno()!=null) {
  16. Predicate agePredicate = cb.between(root.get("seqno"), orgParam.getMinSeqno(),
  17. orgParam.getMaxSeqno());
  18. predicates.add(agePredicate);
  19. }
  20. return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();
  21. }, pageable);
  22. }

JPA多表多条件查询

如果针对多表多条件查询,可以使用原生SQL实现

  1. package com.gf.erp.dao;
  2. import java.sql.Date;
  3. import java.util.List;
  4. import java.util.Map;
  5. import javax.persistence.NamedNativeQuery;
  6. import javax.persistence.SqlResultSetMapping;
  7. import javax.transaction.Transactional;
  8. import org.springframework.data.domain.Page;
  9. import org.springframework.data.domain.Pageable;
  10. import org.springframework.data.jpa.repository.JpaRepository;
  11. import org.springframework.data.jpa.repository.Modifying;
  12. import org.springframework.data.jpa.repository.Query;
  13. import org.springframework.data.repository.query.Param;
  14. import com.gf.erp.model.Account;
  15. import com.gf.erp.model.FunctionInfo;
  16. import com.gf.erp.model.InStoreInfo;
  17. import com.gf.erp.model.OrderInfo;
  18. import com.gf.erp.model.OutStoreInfo;
  19. import com.gf.erp.model.StoreCheckInfo;
  20. import com.gf.erp.model.StoreInfo;
  21. import com.gf.erp.model.StoreNameInfo;
  22. import com.gf.erp.model.UserInfo;
  23. public interface StoreCheckDao extends JpaRepository<StoreCheckInfo,String> {
  24. @Query(value = "select s.* from gufang_storecheck s,gf_content2user cu where s.storeId=cu.entityId "+
  25. "and s.flag=:flag and cu.userId=:userId and cu.module='STORENAME' "+
  26. "and IF (:storeId is not null, s.storeId=:storeId,1 = 1) "+
  27. "and IF (:beginDt is not null, s.beginDt>=:beginDt,1 = 1) "+
  28. "and IF (:endDt is not null, s.endDt<=:endDt,1 = 1) ",
  29. countQuery = "select count(s.id) from gufang_storecheck s,gf_content2user cu where s.storeId=cu.entityId "+
  30. "and s.flag=:flag and cu.userId=:userId and cu.module='STORENAME' "+
  31. "and IF (:storeId is not null, s.storeId=:storeId,1 = 1) "+
  32. "and IF (:beginDt is not null, s.beginDt>=:beginDt,1 = 1) "+
  33. "and IF (:endDt is not null, s.endDt<=:endDt,1 = 1) ",
  34. nativeQuery = true
  35. )
  36. public Page<StoreCheckInfo> findStoreNameListByUserId(@Param("flag") String flag,
  37. @Param("userId") String userId,@Param("storeId") String storeId,
  38. @Param("beginDt") Date beginDt,@Param("endDt") Date endDt,
  39. Pageable pageable);
  40. }

使用EntityManager定义多条件查询

在服务实现类中注入EntityManager,自定义HQL查询数据,并且可以通过多表数据组装对象

  1. @PersistenceContext
  2. private EntityManager entityManager;

在这里插入图片描述

  1. package com.gf.erp.service.impl;
  2. import java.sql.Date;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Set;
  8. import javax.annotation.Resource;
  9. import javax.persistence.EntityManager;
  10. import javax.persistence.PersistenceContext;
  11. import javax.persistence.Query;
  12. import javax.persistence.criteria.CriteriaQuery;
  13. import javax.persistence.criteria.Predicate;
  14. import org.springframework.data.domain.Page;
  15. import org.springframework.data.domain.PageRequest;
  16. import org.springframework.data.domain.Pageable;
  17. import org.springframework.data.domain.Sort;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.transaction.annotation.Propagation;
  20. import org.springframework.transaction.annotation.Transactional;
  21. import org.springframework.util.StringUtils;
  22. import com.gf.erp.dao.FuncDao;
  23. import com.gf.erp.dao.InStoreDao;
  24. import com.gf.erp.dao.InStoreDetailDao;
  25. import com.gf.erp.dao.OrderDao;
  26. import com.gf.erp.dao.OrderItemDao;
  27. import com.gf.erp.dao.OutStoreDao;
  28. import com.gf.erp.dao.OutStoreDetailDao;
  29. import com.gf.erp.dao.PrdtDao;
  30. import com.gf.erp.dao.PrdtTypeDao;
  31. import com.gf.erp.dao.StoreCheckDao;
  32. import com.gf.erp.dao.StoreDao;
  33. import com.gf.erp.dao.StoreNameDao;
  34. import com.gf.erp.dto.PageData;
  35. import com.gf.erp.dto.ResultData;
  36. import com.gf.erp.model.FunctionInfo;
  37. import com.gf.erp.model.InStoreDetailInfo;
  38. import com.gf.erp.model.InStoreInfo;
  39. import com.gf.erp.model.OrderInfo;
  40. import com.gf.erp.model.OutStoreDetailInfo;
  41. import com.gf.erp.model.OutStoreInfo;
  42. import com.gf.erp.model.ProductInfo;
  43. import com.gf.erp.model.ProductTypeInfo;
  44. import com.gf.erp.model.QueryParam;
  45. import com.gf.erp.model.StoreCheckInfo;
  46. import com.gf.erp.model.StoreInfo;
  47. import com.gf.erp.model.StoreNameInfo;
  48. import com.gf.erp.service.FuncService;
  49. import com.gf.erp.service.PrdtService;
  50. import com.gf.erp.service.StoreService;
  51. import com.gf.erp.util.Util;
  52. @Service
  53. @Transactional(readOnly=false,rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
  54. public class StoreServiceImpl implements StoreService{
  55. @Resource
  56. private PrdtDao prdtRepo;
  57. @Resource
  58. private StoreDao storeRepo;
  59. @Resource
  60. private StoreNameDao storeNameDao;
  61. @Resource
  62. private StoreDao storeDao;
  63. @Resource
  64. private OutStoreDao osDao;
  65. @Resource
  66. private InStoreDao isDao;
  67. @Resource
  68. private OrderDao orderDao;
  69. @Resource
  70. private StoreCheckDao storeChkDao;
  71. @PersistenceContext
  72. private EntityManager entityManager;
  73. @Override
  74. public PageData<StoreNameInfo> findStoreNameList(String flag,Integer page,Integer size,String name) {
  75. PageData<StoreNameInfo> rtn = new PageData<StoreNameInfo>();
  76. Sort sort = new Sort(Sort.Direction.DESC,"seqNo");
  77. Pageable p = PageRequest.of(page,size,sort);
  78. Page<StoreNameInfo> list = storeNameDao.findStoreNameList(p,flag,name);
  79. rtn.setSize(size);
  80. rtn.setPage(page);
  81. rtn.setTotal(list.getTotalElements());
  82. rtn.setList(list.getContent());
  83. return rtn;
  84. }
  85. @Override
  86. public List<StoreNameInfo> findStoreNameListByUserId(String flag, String userId) {
  87. return storeNameDao.findStoreNameListByUserId(flag,userId);
  88. }
  89. @Override
  90. public Boolean saveStoreName(StoreNameInfo sni) {
  91. try
  92. {
  93. storeNameDao.save(sni);
  94. return true;
  95. }
  96. catch(Exception e)
  97. {
  98. throw new RuntimeException(e);
  99. }
  100. }
  101. @Override
  102. public ResultData checkDeleteStore(StoreNameInfo sni) {
  103. ResultData rtn = new ResultData(true);
  104. List<OrderInfo> list = orderDao.findByStoreId(sni.getId());
  105. if(list.size()>0)
  106. {
  107. rtn.setIsok(false);
  108. rtn.addMsg("仓库删除", "仓库:["+sni.getName()+"] 存在关联订单记录,禁止删除");
  109. return rtn;
  110. }
  111. List<StoreInfo> list2 = storeDao.findByStoreId(sni.getId());
  112. if(list2.size()>0)
  113. {
  114. rtn.setIsok(false);
  115. rtn.addMsg("仓库删除", "仓库:["+sni.getName()+"] 存在关联库存记录,禁止删除");
  116. return rtn;
  117. }
  118. List<OutStoreInfo> list3 = osDao.findByStoreIdOrToStoreId(sni.getId(), sni.getId());
  119. if(list3.size()>0)
  120. {
  121. rtn.setIsok(false);
  122. rtn.addMsg("仓库删除", "仓库:["+sni.getName()+"] 存在关联出库记录,禁止删除");
  123. return rtn;
  124. }
  125. List<InStoreInfo> list4 = isDao.findByStoreIdOrFromStoreId(sni.getId(), sni.getId());
  126. if(list4.size()>0)
  127. {
  128. rtn.setIsok(false);
  129. rtn.addMsg("仓库删除", "仓库:["+sni.getName()+"] 存在关联入库记录,禁止删除");
  130. return rtn;
  131. }
  132. return rtn;
  133. }
  134. @Override
  135. public Boolean deleteStoreName(String id) {
  136. try
  137. {
  138. storeNameDao.deleteById(id);
  139. return true;
  140. }
  141. catch(Exception e)
  142. {
  143. throw new RuntimeException(e);
  144. }
  145. }
  146. @Override
  147. public PageData<StoreInfo> findStoreList(String flag, Integer page, Integer size, String storeId,
  148. String prdtName) {
  149. PageData<StoreInfo> rtn = new PageData<StoreInfo>();
  150. Sort sort = new Sort(Sort.Direction.DESC,"count");
  151. Pageable p = PageRequest.of(page,size,sort);
  152. Page<StoreInfo> list = storeDao.findStoreList(p,flag,storeId,prdtName);
  153. rtn.setSize(size);
  154. rtn.setPage(page);
  155. rtn.setTotal(list.getTotalElements());
  156. rtn.setList(list.getContent());
  157. return rtn;
  158. }
  159. @Override
  160. public PageData<StoreCheckInfo> findStoreChkListByUserId(String flag,String userId,String storeId,
  161. Date beginDt,Date endDt,Integer page,Integer size) {
  162. PageData<StoreCheckInfo> rtn = new PageData<StoreCheckInfo>();
  163. Sort sort = new Sort(Sort.Direction.DESC,"endDt");
  164. Pageable p = PageRequest.of(page,size,sort);
  165. Page<StoreCheckInfo> list = storeChkDao.findStoreChkListByUserId(flag, userId, storeId, beginDt, endDt, p);
  166. rtn.setSize(size);
  167. rtn.setPage(page);
  168. rtn.setTotal(list.getTotalElements());
  169. rtn.setList(list.getContent());
  170. return rtn;
  171. }
  172. @Override
  173. public PageData<StoreCheckInfo> findStoreChkList(String flag,String storeId,
  174. Date beginDt,Date endDt,Integer page,Integer size) {
  175. PageData<StoreCheckInfo> rtn = new PageData<StoreCheckInfo>();
  176. Sort sort = new Sort(Sort.Direction.DESC,"endDt");
  177. Pageable p = PageRequest.of(page,size,sort);
  178. Page<StoreCheckInfo> list = storeChkDao.findStoreChkList(flag,storeId, beginDt, endDt, p);
  179. rtn.setSize(size);
  180. rtn.setPage(page);
  181. rtn.setTotal(list.getTotalElements());
  182. rtn.setList(list.getContent());
  183. return rtn;
  184. }
  185. @Override
  186. public PageData<StoreCheckInfo> findStoreChkList2(String flag,String storeId,
  187. Date beginDt,Date endDt,Integer page,Integer size) {
  188. PageData<StoreCheckInfo> rtn = new PageData<StoreCheckInfo>();
  189. Sort sort = new Sort(Sort.Direction.DESC,"endDt");
  190. Integer startPosition = (page-1)*size;
  191. String hql = "select new StoreCheckInfo(s.id,s.storeId,s.jbUserId,s.beginDt,"+
  192. "s.endDt,s.status,s.isCurrent,s.flag,s.testMode,sn.name) from StoreCheckInfo s,"+
  193. "StoreNameInfo sn where s.storeId=sn.id ";
  194. if(!Util.isNull(storeId))
  195. {
  196. hql = hql + "and s.storeId=:storeId";
  197. }
  198. Query q = entityManager.createQuery(hql);
  199. if(!Util.isNull(storeId))
  200. {
  201. q.setParameter("storeId", storeId);
  202. }
  203. Long total = new Long(q.getResultList().size());
  204. q.setFirstResult(startPosition);
  205. q.setMaxResults(size);
  206. List<StoreCheckInfo> list = q.getResultList();
  207. rtn.setSize(size);
  208. rtn.setPage(page);
  209. rtn.setTotal(total);
  210. rtn.setList(list);
  211. return rtn;
  212. }
  213. }

JPA多表数据组织实体对象

需要在JPQL中使用构造方法创建对象
在这里插入图片描述

  1. package com.gf.erp.dao;
  2. import java.util.List;
  3. import java.util.Map;
  4. import javax.persistence.NamedNativeQuery;
  5. import javax.persistence.SqlResultSetMapping;
  6. import javax.transaction.Transactional;
  7. import org.springframework.data.domain.Page;
  8. import org.springframework.data.domain.Pageable;
  9. import org.springframework.data.jpa.repository.JpaRepository;
  10. import org.springframework.data.jpa.repository.Modifying;
  11. import org.springframework.data.jpa.repository.Query;
  12. import com.gf.erp.model.UserInfo;
  13. public interface UserDao extends JpaRepository<UserInfo,String> {
  14. @Query(value = "select * from orgmodel_user",nativeQuery = true)
  15. Page<UserInfo> findPageUser(Pageable pageable);
  16. @Query(value = "select u from UserInfo u where u.orgId=?1")
  17. List<UserInfo> getUserListByOrgId(String orgId);
  18. List<UserInfo> findByOrgPathLike(String path);
  19. UserInfo findByFlagAndLoginId(String flag,String loginId);
  20. @Query(value = "select new UserInfo(u.id,u.name,u.loginId,u.password,u.cardId,"+
  21. "u.birthday,u.address,u.companyMail,u.privateMail,"+
  22. "u.companyTeleNo,u.homeTeleNo,u.mobile,u.title,"+
  23. "u.orgId,u.orgPath,u.desc,u.enabled,u.locked,"+
  24. "u.managerId,u.shopId,u.failureDate,u.failureCount,"+
  25. "u.openid,u.securityLevel,u.seqno,u.flag,"+
  26. "o.name,o.name) from UserInfo u,OrgInfo o where u.orgId=o.id",
  27. countQuery = "select count(u) from UserInfo u")
  28. Page<UserInfo> findPageFilledUser(Pageable pageable);
  29. @Query(value = "select o.name as department,u.* from orgmodel_user u,orgmodel_org o where u.orgid=o.id",
  30. countQuery = "select count(*) from orgmodel_user",
  31. nativeQuery = true)
  32. List<Map<String,Object>> findMapUser(Pageable pageable);
  33. @Modifying
  34. @Query("update UserInfo u set u.locked=?2 where u.id=?1")
  35. void updateUserLockById(String id,String locked);
  36. }

发表评论

表情:
评论列表 (有 0 条评论,15人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Spring Data JPA查询

    多表查询在Spring Data JPA中有两种实现方式 第一种创建一个结果集接口来接收多表连查的结果 第二种利用JPA的关联映射来实现 先来熟悉一下几个注解 <t

    相关 条件查询

    > 多条件查询就是将sql语句进行拼接,在这里需要用到一个where 1=1 表示条件永远成立,这样就少了对where和and的处理 上代码,一目了然 String