• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • JPA多表多條件查詢解決思路

    標簽: Mybatis

    JPA單表多條件查詢

    可以在Service層使用Predicate實現
    ServiceImpl實現類,查詢條件可以自定義

    	@Override
    	public Page<OrgInfo> findOrgByCondition(OrgParam orgParam, Pageable pageable)
    	{
    		return orgRepository.findAll((root, query, cb) -> {
    			List<Predicate> predicates = new ArrayList<>();
                if (!StringUtils.isEmpty(orgParam.getFlag())){
                    predicates.add(cb.equal(root.get("flag"),orgParam.getFlag()));
                }
                if (!StringUtils.isEmpty(orgParam.getParentId())){
                    predicates.add(cb.equal(root.get("parentId"),orgParam.getParentId()));
                }
                if (!StringUtils.isEmpty(orgParam.getName())){
                    predicates.add(cb.like(root.get("name"),orgParam.getName()+"%"));
                }
                if (orgParam.getMinSeqno()!=null && orgParam.getMaxSeqno()!=null) {
                    Predicate agePredicate = cb.between(root.get("seqno"), orgParam.getMinSeqno(),
                    		orgParam.getMaxSeqno());
                    predicates.add(agePredicate);
                }
                return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();
    		}, pageable);
    	}
    

    JPA多表多條件查詢

    如果針對多表多條件查詢,可以使用原生SQL實現

    package com.gf.erp.dao;
    
    
    import java.sql.Date;
    import java.util.List;
    import java.util.Map;
    
    import javax.persistence.NamedNativeQuery;
    import javax.persistence.SqlResultSetMapping;
    import javax.transaction.Transactional;
    
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.data.jpa.repository.Modifying;
    import org.springframework.data.jpa.repository.Query;
    import org.springframework.data.repository.query.Param;
    
    import com.gf.erp.model.Account;
    import com.gf.erp.model.FunctionInfo;
    import com.gf.erp.model.InStoreInfo;
    import com.gf.erp.model.OrderInfo;
    import com.gf.erp.model.OutStoreInfo;
    import com.gf.erp.model.StoreCheckInfo;
    import com.gf.erp.model.StoreInfo;
    import com.gf.erp.model.StoreNameInfo;
    import com.gf.erp.model.UserInfo;
    
    public interface StoreCheckDao extends JpaRepository<StoreCheckInfo,String> {
    
    	@Query(value = "select s.* from gufang_storecheck s,gf_content2user cu where s.storeId=cu.entityId "+
    		"and s.flag=:flag and cu.userId=:userId and cu.module='STORENAME' "+
    		"and IF (:storeId is not null, s.storeId=:storeId,1 = 1) "+
    		"and IF (:beginDt is not null, s.beginDt>=:beginDt,1 = 1) "+
    		"and IF (:endDt is not null, s.endDt<=:endDt,1 = 1) ",
    		countQuery = "select count(s.id) from gufang_storecheck s,gf_content2user cu where s.storeId=cu.entityId "+
    		"and s.flag=:flag and cu.userId=:userId and cu.module='STORENAME' "+
    		"and IF (:storeId is not null, s.storeId=:storeId,1 = 1) "+
    		"and IF (:beginDt is not null, s.beginDt>=:beginDt,1 = 1) "+
    		"and IF (:endDt is not null, s.endDt<=:endDt,1 = 1) ",
    		nativeQuery = true
    	)
    	public Page<StoreCheckInfo> findStoreNameListByUserId(@Param("flag") String flag,
    			@Param("userId") String userId,@Param("storeId") String storeId,
    			@Param("beginDt") Date beginDt,@Param("endDt") Date endDt,
    			Pageable pageable);
    
    }
    

    使用EntityManager定義多條件查詢

    在服務實現類中注入EntityManager,自定義HQL查詢數據,并且可以通過多表數據組裝對象

    @PersistenceContext
    private EntityManager entityManager;
    

    在這里插入圖片描述

    package com.gf.erp.service.impl;
    
    import java.sql.Date;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    import javax.annotation.Resource;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.persistence.Query;
    import javax.persistence.criteria.CriteriaQuery;
    import javax.persistence.criteria.Predicate;
    
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.PageRequest;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.domain.Sort;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Propagation;
    import org.springframework.transaction.annotation.Transactional;
    import org.springframework.util.StringUtils;
    
    import com.gf.erp.dao.FuncDao;
    import com.gf.erp.dao.InStoreDao;
    import com.gf.erp.dao.InStoreDetailDao;
    import com.gf.erp.dao.OrderDao;
    import com.gf.erp.dao.OrderItemDao;
    import com.gf.erp.dao.OutStoreDao;
    import com.gf.erp.dao.OutStoreDetailDao;
    import com.gf.erp.dao.PrdtDao;
    import com.gf.erp.dao.PrdtTypeDao;
    import com.gf.erp.dao.StoreCheckDao;
    import com.gf.erp.dao.StoreDao;
    import com.gf.erp.dao.StoreNameDao;
    import com.gf.erp.dto.PageData;
    import com.gf.erp.dto.ResultData;
    import com.gf.erp.model.FunctionInfo;
    import com.gf.erp.model.InStoreDetailInfo;
    import com.gf.erp.model.InStoreInfo;
    import com.gf.erp.model.OrderInfo;
    import com.gf.erp.model.OutStoreDetailInfo;
    import com.gf.erp.model.OutStoreInfo;
    import com.gf.erp.model.ProductInfo;
    import com.gf.erp.model.ProductTypeInfo;
    import com.gf.erp.model.QueryParam;
    import com.gf.erp.model.StoreCheckInfo;
    import com.gf.erp.model.StoreInfo;
    import com.gf.erp.model.StoreNameInfo;
    import com.gf.erp.service.FuncService;
    import com.gf.erp.service.PrdtService;
    import com.gf.erp.service.StoreService;
    import com.gf.erp.util.Util;
    
    @Service
    @Transactional(readOnly=false,rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
    public class StoreServiceImpl implements StoreService{
    	@Resource
    	private PrdtDao prdtRepo;
    	@Resource
    	private StoreDao storeRepo;
    	@Resource
    	private StoreNameDao storeNameDao;
    	@Resource
    	private StoreDao storeDao;
    	@Resource
    	private OutStoreDao osDao;
    	@Resource
    	private InStoreDao isDao;
    	@Resource
    	private OrderDao orderDao;
    	@Resource
    	private StoreCheckDao storeChkDao;
    	
    	@PersistenceContext
    	private EntityManager entityManager;
    	
    	@Override
    	public PageData<StoreNameInfo> findStoreNameList(String flag,Integer page,Integer size,String name) {
    		PageData<StoreNameInfo> rtn = new PageData<StoreNameInfo>();
    		Sort sort = new Sort(Sort.Direction.DESC,"seqNo");
            Pageable p = PageRequest.of(page,size,sort);
            Page<StoreNameInfo> list = storeNameDao.findStoreNameList(p,flag,name);
            rtn.setSize(size);
            rtn.setPage(page);
            rtn.setTotal(list.getTotalElements());
            rtn.setList(list.getContent());
    		return rtn;
    	}
    	
    
    	@Override
    	public List<StoreNameInfo> findStoreNameListByUserId(String flag, String userId) {
    		return storeNameDao.findStoreNameListByUserId(flag,userId);
    	}
    
    	@Override
    	public Boolean saveStoreName(StoreNameInfo sni) {
    		try
    		{
    			storeNameDao.save(sni);
    			return true;
    		}
    		catch(Exception e)
    		{
    			throw new RuntimeException(e);
    		}
    	}
    
    	@Override
    	public ResultData checkDeleteStore(StoreNameInfo sni) {
    		ResultData rtn = new ResultData(true);
    		List<OrderInfo> list = orderDao.findByStoreId(sni.getId());
    		if(list.size()>0)
    		{
    			rtn.setIsok(false);
    			rtn.addMsg("倉庫刪除", "倉庫:["+sni.getName()+"] 存在關聯訂單記錄,禁止刪除");
    			return rtn;
    		}
    		List<StoreInfo> list2 = storeDao.findByStoreId(sni.getId());
    		if(list2.size()>0)
    		{
    			rtn.setIsok(false);
    			rtn.addMsg("倉庫刪除", "倉庫:["+sni.getName()+"] 存在關聯庫存記錄,禁止刪除");
    			return rtn;
    		}
    		List<OutStoreInfo> list3 = osDao.findByStoreIdOrToStoreId(sni.getId(), sni.getId());
    		if(list3.size()>0)
    		{
    			rtn.setIsok(false);
    			rtn.addMsg("倉庫刪除", "倉庫:["+sni.getName()+"] 存在關聯出庫記錄,禁止刪除");
    			return rtn;
    		}
    		List<InStoreInfo> list4 = isDao.findByStoreIdOrFromStoreId(sni.getId(), sni.getId());
    		if(list4.size()>0)
    		{
    			rtn.setIsok(false);
    			rtn.addMsg("倉庫刪除", "倉庫:["+sni.getName()+"] 存在關聯入庫記錄,禁止刪除");
    			return rtn;
    		}
    		return rtn;
    	}
    
    	@Override
    	public Boolean deleteStoreName(String id) {
    		try
    		{
    			storeNameDao.deleteById(id);
    			return true;
    		}
    		catch(Exception e)
    		{
    			throw new RuntimeException(e);
    		}
    	}
    
    	@Override
    	public PageData<StoreInfo> findStoreList(String flag, Integer page, Integer size, String storeId,
    			String prdtName) {
    		PageData<StoreInfo> rtn = new PageData<StoreInfo>();
    		Sort sort = new Sort(Sort.Direction.DESC,"count");
            Pageable p = PageRequest.of(page,size,sort);
            Page<StoreInfo> list = storeDao.findStoreList(p,flag,storeId,prdtName);
            rtn.setSize(size);
            rtn.setPage(page);
            rtn.setTotal(list.getTotalElements());
            rtn.setList(list.getContent());
    		return rtn;
    	}
    	
    	@Override
    	public PageData<StoreCheckInfo> findStoreChkListByUserId(String flag,String userId,String storeId,
    			Date beginDt,Date endDt,Integer page,Integer size) {
    		PageData<StoreCheckInfo> rtn = new PageData<StoreCheckInfo>();
    		Sort sort = new Sort(Sort.Direction.DESC,"endDt");
            Pageable p = PageRequest.of(page,size,sort);
            
            Page<StoreCheckInfo> list = storeChkDao.findStoreChkListByUserId(flag, userId, storeId, beginDt, endDt, p);
            rtn.setSize(size);
            rtn.setPage(page);
            rtn.setTotal(list.getTotalElements());
            rtn.setList(list.getContent());
    		return rtn;
    	}
    
    	@Override
    	public PageData<StoreCheckInfo> findStoreChkList(String flag,String storeId,
    			Date beginDt,Date endDt,Integer page,Integer size) {
    		PageData<StoreCheckInfo> rtn = new PageData<StoreCheckInfo>();
    		Sort sort = new Sort(Sort.Direction.DESC,"endDt");
            Pageable p = PageRequest.of(page,size,sort);
            
            Page<StoreCheckInfo> list = storeChkDao.findStoreChkList(flag,storeId, beginDt, endDt, p);
            rtn.setSize(size);
            rtn.setPage(page);
            rtn.setTotal(list.getTotalElements());
            rtn.setList(list.getContent());
    		return rtn;
    	}
    	
    	@Override
    	public PageData<StoreCheckInfo> findStoreChkList2(String flag,String storeId,
    			Date beginDt,Date endDt,Integer page,Integer size) {
    		PageData<StoreCheckInfo> rtn = new PageData<StoreCheckInfo>();
    		Sort sort = new Sort(Sort.Direction.DESC,"endDt");
    		Integer startPosition = (page-1)*size;
            
            String hql = "select new StoreCheckInfo(s.id,s.storeId,s.jbUserId,s.beginDt,"+
            		"s.endDt,s.status,s.isCurrent,s.flag,s.testMode,sn.name) from StoreCheckInfo s,"+
            		"StoreNameInfo sn where s.storeId=sn.id ";
            if(!Util.isNull(storeId))
            {
            	hql = hql + "and s.storeId=:storeId";
            }
            Query q = entityManager.createQuery(hql);
            if(!Util.isNull(storeId))
            {
            	q.setParameter("storeId", storeId);
            }
            Long total  = new Long(q.getResultList().size());
            q.setFirstResult(startPosition);
            q.setMaxResults(size);
            List<StoreCheckInfo> list = q.getResultList();
            rtn.setSize(size);
            rtn.setPage(page);
            rtn.setTotal(total);
            rtn.setList(list);
    		return rtn;
    	}
    }
    
    

    JPA多表數據組織實體對象

    需要在JPQL中使用構造方法創建對象
    在這里插入圖片描述

    package com.gf.erp.dao;
    
    
    import java.util.List;
    import java.util.Map;
    
    import javax.persistence.NamedNativeQuery;
    import javax.persistence.SqlResultSetMapping;
    import javax.transaction.Transactional;
    
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.data.jpa.repository.Modifying;
    import org.springframework.data.jpa.repository.Query;
    
    import com.gf.erp.model.UserInfo;
    
    public interface UserDao extends JpaRepository<UserInfo,String> {
    
        @Query(value = "select * from orgmodel_user",nativeQuery = true)
        Page<UserInfo> findPageUser(Pageable pageable);
        
        @Query(value = "select u from UserInfo u where u.orgId=?1")
        List<UserInfo> getUserListByOrgId(String orgId);
        
        List<UserInfo> findByOrgPathLike(String path);
        
        UserInfo findByFlagAndLoginId(String flag,String loginId);
        
        @Query(value = "select new UserInfo(u.id,u.name,u.loginId,u.password,u.cardId,"+
    			"u.birthday,u.address,u.companyMail,u.privateMail,"+
    			"u.companyTeleNo,u.homeTeleNo,u.mobile,u.title,"+
    			"u.orgId,u.orgPath,u.desc,u.enabled,u.locked,"+
    			"u.managerId,u.shopId,u.failureDate,u.failureCount,"+
    			"u.openid,u.securityLevel,u.seqno,u.flag,"+
    			"o.name,o.name) from UserInfo u,OrgInfo o where u.orgId=o.id",
        		countQuery = "select count(u) from UserInfo u")
        Page<UserInfo> findPageFilledUser(Pageable pageable);
        
        @Query(value = "select o.name as department,u.* from orgmodel_user u,orgmodel_org o where u.orgid=o.id",
        		countQuery = "select count(*) from orgmodel_user",
        		nativeQuery = true)
        List<Map<String,Object>> findMapUser(Pageable pageable);
        
        @Modifying
        @Query("update UserInfo u set u.locked=?2 where u.id=?1")
        void updateUserLockById(String id,String locked);
    }
    
    版權聲明:本文為qixiang_chen原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qixiang_chen/article/details/104465916

    智能推薦

    Java多條件查詢

      查詢是我們日常生活中最常見的功能,有的查詢很復雜,有的查詢很簡單,而我要說的查詢說它復雜也不復雜,說它簡單也不是很簡單。下面我先給出我的UI界面和業務需求。   需求是需要根據樹形的某個節點查詢對應類型商品信息(注意:如果這個節點下存在子節點,那么需要把這個節點下所有子節點對應的商品類型的商品信息查詢出來),或者在它的基礎上在篩選出不同狀態的商品信息,還...

    多條件查詢

    文獻種類:專題技術文獻; 開發工具與關鍵技術:Visual Studio 作者:吳新洋 ;年級:1801 ;撰寫時間:2019 年 6 月 3 日 文獻編號: 歸檔時間: 年 月 日 多條件查詢 $(function () { createSelect(“SupplierName”, “selSupplier”)下拉框綁定查詢 createSelec...

    基于MybatisPlus實現多表的關聯查詢,實現分頁,多條件查詢

    1、緣由 實現商品表,通過表內的id關聯查詢到供應商表的name屬性 商品表 如下所示 供應商表 如下所示 新建查詢測試sql 注意, 1、查詢tb_goods表的全部,所以用t1.*,查詢t2表的name,并用supplierName替換名稱 2、使用LEFT JOIN鏈入tb_supplier表,tb_goods為主表 3、使用on來判斷連接條件 4、where下面是查詢條件,用like模糊查...

    Springdata Jpa 多表查詢

    Springdata Jpa 多表查詢 一、一對多關系 1.一對多數據表的建立 ? SQL腳本: 2.實體類映射關系 3.映射注解說明 4.實體類接口 5.一對多的添加測試 通過保存的案例,我們可以發現在設置了雙向關系之后,會發送兩條insert語句,一條多余的update語句,那我們的解決是思路很簡單,就是一的一方放棄維護權 6.一對多的刪除 刪除操作的說明 7.級聯操作 ? 級聯操作:指操作一...

    Java使用mongodb進行數據存儲及多表關聯,多條件查詢

    前言:      在開發的過程中,由于持久層使用的是非關系型數據庫mongodb,涉及到列表查詢的多表關聯查詢,在實現此功能的過程中出現了不少問題,做下記錄方便以后遇到此類問題可以快速的解決,同時為遇到此類問題的小伙伴提供一點幫助。     注: Java操作mongodb數據庫存儲數據,數據訪問層需繼承 MongoRepository 接口,本實...

    猜你喜歡

    利用mybatis-plus實現多條件+分頁+多表聯合查詢的編寫方法

    文章目錄 前言 一、創建條件查詢的VO 二、創建兩個實體類 1.Album類 2.AlbumPic類 三、創建AlbumPicResVO類 四、構建mapper接口 五、構建mapper.xml文件 六、構建service接口 七、構建service實現類 八、Controller類里的查詢方法中調用 結尾 前言 mybatis-plus的多條件+分頁+多表查詢的編寫方法 一、創建條件查詢的VO ...

    SpringBoot JPA使用Specification多條件查詢(精確查詢、模糊查詢、時間段查詢)及分頁

    1.實體類Mobile 2.MobileRepository,注意需要基礎JpaSpecificationExecutor 3.PageParamRequest請求參數體 4.MobileService 5.MobileSpecification 6.MobileController 7.測試  http://localhost:8080/mobile/list?searchId=&am...

    Unity_Shader高級篇_13.1_Unity Shader入門精要

    13.4 再談邊緣檢測 在12.3中,我們曾使用Sobel算子對屏幕圖像進行邊緣測試,實現描邊的效果。但是,這種直接利用顏色信息進行邊緣檢測的方法會產生很對我們不希望得到的邊緣線,如圖13.8所示。 可以看出,物體的紋理、陰影等位置也被描上黑邊,而這往往不是我們希望看到的。在本節中,我們將學習如何在深度和法線上進行邊緣檢測,這些圖像不會受紋理和光照的影響,而僅僅保存了當前渲染物體的模型信息,通過這...

    Seata AT 模式 原理詳解

    目錄 前提 整體機制 寫隔離 讀隔離 工作機制 一階段 二階段-回滾 二階段-提交 附錄 回滾日志表 前提 基于支持本地 ACID 事務的關系型數據庫。 Java 應用,通過 JDBC 訪問數據庫。 整體機制 兩階段提交協議的演變: 一階段:業務數據和回滾日志記錄在同一個本地事務中提交,釋放本地鎖和連接資源。 二階段: 提交異步化,非常快速地完成。 回滾通過一階段的回滾日志進行反向補償。 寫隔離 ...

    Python爬蟲 | 滑動驗證碼**

    極驗驗證碼:需要手動拼合滑塊來完成的驗證,相對圖形驗證碼識別難度上升了幾個等級。下面用程序識別并通過極驗驗證碼的驗證,其中有分析識別思路、識別缺口位置、生成滑塊拖動、模擬實現滑塊拼合通過驗證等步驟。需要用到Chrome 瀏覽器,并配置 ChromeDriver ,要用到的 Python 庫是 Selenium。 1、 對極驗驗證碼了解   極驗驗證碼官網:http://www.geetest.co...

    精品国产乱码久久久久久蜜桃不卡