springDataJpa複雜多表sql的多條件結合分頁實現

如題;此類查詢,jpa自帶的單表、本地sql查詢已經沒法知足需求,基於此要求,咱們須要調用jpa的EntityManager內置查詢引擎,方可實現。sql

在ReportRespository的實現類中引入實體管理引擎:app

@PersistenceContext  
private EntityManager entityManager;  ide

sql組裝:spa

@Override
    public Long findOrderAmountByCondition(QueryParameter parameter) {
        boolean isGroup =false;
        String whereStr =" where 1=1 ";
        StringBuffer sql = new StringBuffer();
        sql.append("select  ");
       if( commonUtil.isObjNullOrEmp(parameter.getFirstDeptHid())
               && "1".equals(parameter.getDeptSelect())){
              sql.append( " c_first_dept_hid,"); //部門ID
              sql.append( " max( c_first_dept_name),");//部門名稱
       }else{
           sql.append(" max( c_first_dept_hid),max(c_first_dept_name),");
       }
       if(!commonUtil.isObjNullOrEmp(parameter.getMonthSelect()) && "1".equals(parameter.getMonthSelect())){
          sql.append(" to_char(createTime,'YYYY-MM') ,"); //月份
        }else{
             sql.append(" '月份' ,");
        }
       if( (commonUtil.isObjNullOrEmp(parameter.getSupplier()) && "1".equals(parameter.getSupplierSelect())) 
                || !commonUtil.isObjNullOrEmp(parameter.getSupplier())){
           sql.append( " (case supplier when '1' then '蘇寧' when '2' then '史泰博'  when '3' then '得力' else '' END )as supplier," );//平臺
       }else{
           sql.append(" '所有平臺'  ,") ;//全部
       }
        sql.append(" sum(personalPrice) ,"//我的版價格
        + " count(1) ," //訂單數量
        + " sum(totalprice), " //下單金額
        +" sum(quantity) "
        + " from ");
        selectOrderAmountUnionInnerQuerySql(parameter, sql);
        sql.append(" where 1=1 ");
        
        if(commonUtil.isObjNullOrEmp(parameter.getFirstDeptHid()) 
                && "1".equals(parameter.getDeptSelect())){
            //區分部門
            sql.append(" c_first_dept_hid,");
            isGroup =true;
        } 
        if( (commonUtil.isObjNullOrEmp(parameter.getSupplier()) && "1".equals(parameter.getSupplierSelect())) 
                || !commonUtil.isObjNullOrEmp(parameter.getSupplier())){
            sql.append( " supplier," );//平臺
            isGroup =true;
        }
        
        if(!commonUtil.isObjNullOrEmp(parameter.getMonthSelect()) 
                && "1".equals(parameter.getMonthSelect()) ){
            isGroup =true;
            sql.append(" to_char(createTime,'YYYY-MM') ");
            sql.append(" order by  to_char(createTime,'YYYY-MM') asc ");
        }else{
            sql = new StringBuffer(sql.substring(0, sql.length()-1));
        }
     
        if(isGroup){
            sql.insert(sql.lastIndexOf(whereStr) + whereStr.length(), "  group by  ");
        }
        //經過組裝好的sql建立查詢引擎對象Query
        Query query =   entityManager.createNativeQuery(sql.toString());  
        if(!commonUtil.isObjNullOrEmp(parameter.getStartTime()) && !commonUtil.isObjNullOrEmp(parameter.getEndTime()) ){
            if(!commonUtil.isObjNullOrEmp(parameter.getMonthSelect()) && "1".equals(parameter.getMonthSelect())){
                parameter.setStartTime(parameter.getStartTime().substring(0, 7));
                parameter.setEndTime(parameter.getEndTime().substring(0, 7));
            } 
        }
        setParameterValues(query,parameter);.net

        //須要分頁時,可在此處添加
        //query.setFirstResult((pageable.getPageNumber()-1) * pageable.getPageSize());  
        //query.setMaxResults(pageable.getPageSize());  

        @SuppressWarnings("unchecked")
        List<Object[]> objectList = query.getResultList();  //獲取查詢結果
        if(null==objectList || objectList.size()==0){
            return 0L;
        }else{
            return new Long(objectList.size());
        }
    }對象

設置其餘參數:get

/**
     * 設置參數值
     * @param query
     * @param supplier
     * @param startTime
     * @param endTime
     * @param firstDeptId
     */
    public void setParameterValues(Query query,QueryParameter parameter){
        if(!commonUtil.isObjNullOrEmp(parameter)){
               if(!commonUtil.isObjNullOrEmp(parameter.getStartTime()) 
                       && !commonUtil.isObjNullOrEmp(parameter.getEndTime()) ){
                   query.setParameter("startTime", parameter.getStartTime());
                   query.setParameter("endTime", parameter.getEndTime());
               }
               if(!commonUtil.isObjNullOrEmp(parameter.getSupplier()) ){
                   query.setParameter("supplier", parameter.getSupplier());
               }
               if(!commonUtil.isObjNullOrEmp(parameter.getFirstDeptHid()) ){
                   query.setParameter("firstDeptHid", parameter.getFirstDeptHid());
               }
               
               if(null!=parameter.getStatusList() && parameter.getStatusList().size()>0){
                   query.setParameter("status", parameter.getStatusList());
               }
               
               if(!commonUtil.isObjNullOrEmp(parameter.getName()) ){
                   query.setParameter("name", "%"+parameter.getName()+"%");
               }
        }
    }string

相關文章
相關標籤/搜索