zoukankan      html  css  js  c++  java
  • 一次SQL查询语句的优化

    1.项目中之前的"我关注的拍品列表"需要添加筛选功能,因为目前显示的关注的拍品太多没有进行分类,用户体验差。

       

    2.添加筛选条件之后,可以筛选出“未开始”“进行中”“已结束”三种情况的拍品。

       其中   

              “未开始”--->状态为    1

        “进行中”---->状态为   2

        “已结束”---->状态为   3  or   4   or 5  or 6  or 7

    3.优化之前,每一个条件都书写了一个SQL 语句。 功能能够实现,但是代码比较冗余。

        

    //未开始状态
    @Query(value="SELECT a.id,a.auc_id,a.crt_time,a.crt_user_id,a.crt_user_name,a.customer_id,a.upd_time,a.upd_user_id,a.upd_user_name FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id " + "AND a.customer_id = ?1 AND ( b.STATUS = 1) order by a.crt_time desc limit ?2,?3",nativeQuery=true) List<AucAttention> findAllByCustomerIdAndAucLotStatus1(Long customerId, int i, int rows); @Query(value="select count(*) from (SELECT a.id FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id " + "AND a.customer_id = ?1 AND ( b.STATUS = 1)) as temp",nativeQuery=true) int findAllCountByCustomerIdAndAucLotStatus1(Long customerId); //进行中状态 @Query(value="SELECT a.id,a.auc_id,a.crt_time,a.crt_user_id,a.crt_user_name,a.customer_id,a.upd_time,a.upd_user_id,a.upd_user_name FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id " + "AND a.customer_id = ?1 AND ( b.STATUS = 2) order by a.crt_time desc limit ?2,?3",nativeQuery=true) List<AucAttention> findAllByCustomerIdAndAucLotStatus2(Long customerId, int i, int rows); @Query(value="select count(*) from (SELECT a.id FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id " + "AND a.customer_id = ?1 AND ( b.STATUS = 2)) as temp",nativeQuery=true) int findAllCountByCustomerIdAndAucLotStatus2(Long customerId); //已结束状态 @Query(value="SELECT a.id,a.auc_id,a.crt_time,a.crt_user_id,a.crt_user_name,a.customer_id,a.upd_time,a.upd_user_id,a.upd_user_name FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id " + "AND a.customer_id = ?1 AND ( b.STATUS != 1 AND b.STATUS != 2) order by a.crt_time desc limit ?2,?3",nativeQuery=true) List<AucAttention> findAllByCustomerIdAndAucLotStatus3(Long customerId, int i, int rows); @Query(value="select count(*) from (SELECT a.id FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id " + "AND a.customer_id = ?1 AND ( b.STATUS != 1 AND b.STATUS != 2)) as temp",nativeQuery=true) int findAllCountByCustomerIdAndAucLotStatus3(Long customerId); //默认状态 @Query(value="SELECT a.id,a.auc_id,a.crt_time,a.crt_user_id,a.crt_user_name,a.customer_id,a.upd_time,a.upd_user_id,a.upd_user_name FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id " + "AND a.customer_id = ?1 order by a.crt_time desc limit ?2,?3",nativeQuery=true) List<AucAttention> findAllByCustomerIdAndAucLotStatus(Long customerId, int i, int rows); @Query(value="select count(*) from (SELECT a.id FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id " + "AND a.customer_id = ?1 ) as temp",nativeQuery=true) int findAllCountByCustomerIdAndAucLotStatus(Long customerId);

    4.优化之后,公用一个SQL语句即可。

       控制器方法:

        

    /**
         * 返回所有的我关注的拍品列表 筛选条件 未开始,进行中,已结束
         * 
         * 1 未开始 2 进行中 3 已结束
         * 
         * @param request
         * @return
         */
        @RequestMapping(value = "/auctionFocusOnList", method = RequestMethod.POST)
        @ResponseBody
        public ResultDTO<Map<String, Object>> findAllMyFocusOn(Integer checkStatus, int page, int rows,
                HttpServletRequest request) {
            if (checkStatus == null) {
                checkStatus = 0;
            }
    
            Map<String, Object> retMap = null;
            List<Map<String, Object>> focusOnList = new ArrayList<>();
    
            // 获取session中的登陆对象
            Customer user = (Customer) request.getSession().getAttribute("user");
    
            List<AucAttention> aucAttentionList = null;
    
            // 获取所有的关注的拍品的条件
            if (null != user) {
                Long customerId = Long.valueOf(user.id());
                int total = 0;
    
                if (checkStatus == 1) {// 未开始
                    aucAttentionList = aucAttentionRepository.findAllByCustomerIdAndAucLotStatus(customerId,
                            (page - 1) * rows, rows, 1, 0, 0, 0, 0, 0, 0);
                    total = aucAttentionRepository.findAllCountByCustomerIdAndAucLotStatus(customerId, 1, 0, 0, 0, 0, 0, 0);
    
                } else if (checkStatus == 2) {// 进行中
    
                    aucAttentionList = aucAttentionRepository.findAllByCustomerIdAndAucLotStatus(customerId,
                            (page - 1) * rows, rows, 2, 0, 0, 0, 0, 0, 0);
                    total = aucAttentionRepository.findAllCountByCustomerIdAndAucLotStatus(customerId, 2, 0, 0, 0, 0, 0, 0);
                } else if (checkStatus == 3) {// 已结束
    
                    aucAttentionList = aucAttentionRepository.findAllByCustomerIdAndAucLotStatus(customerId,
                            (page - 1) * rows, rows, 3, 4, 5, 6, 7, 0, 0);
                    total = aucAttentionRepository.findAllCountByCustomerIdAndAucLotStatus(customerId, 3, 4, 5, 6, 7, 0, 0);
                } else {// 默认情况
    
                    aucAttentionList = aucAttentionRepository.findAllByCustomerIdAndAucLotStatus(customerId,
                            (page - 1) * rows, rows, 1, 2, 3, 4, 5, 6, 7);
                    total = aucAttentionRepository.findAllCountByCustomerIdAndAucLotStatus(customerId, 1, 2, 3, 4, 5, 6, 7);
                }
    
                Map<String, Object> map = null;
                AucLot aucLot = null;
                int auctionStatus = 4;
                String startTime = null;
                String endTime = null;
                String aucLotTime = null;
                SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy.MM.dd");// 格式化时间
    
                for (AucAttention aucAttention : aucAttentionList) {
                    map = new HashMap<String, Object>();
    
                    aucLot = aucLotRepository.findOne(aucAttention.aucId());
    
                    if (aucLot != null) {
                        startTime = dateFormater.format(aucLot.startTime());// 拍卖开始时间
                        endTime = dateFormater.format(aucLot.endTime());// 拍卖结束时间
    
                        // 定义拍卖时间,开始时间和结束时间的拼接
                        if (startTime.equals(endTime)) {
                            aucLotTime = startTime;
                        } else {
                            aucLotTime = startTime + "-" + endTime;
                        }
    
                        map.put("aucLotId", aucLot.id());// 拍卖id
                        map.put("goodsName", aucLot.goodsName());// 拍品名称
                        map.put("aucLotTime", aucLotTime);// 拍品时间
                        map.put("status", aucLot.status());// 拍卖状态
    
                        // 关注的拍品的拍卖资质对象的条件
                        Specification<AucBrand> aucBrandSpec = (root, query, cb) -> {
                            List<Predicate> predicates = new ArrayList<Predicate>();
                            if (null != aucAttention) {
                                Predicate predicate = cb.equal(root.get(AucBrand_.customerId), aucAttention.customerId());// 竞买人id
                                predicates.add(predicate);
                            }
                            if (null != aucAttention) {
                                Predicate predicate = cb.equal(root.get(AucBrand_.aucLot).get(AucLot_.id),
                                        aucAttention.aucId());// 拍品id
                                predicates.add(predicate);
                            }
                            if (!predicates.isEmpty()) {
                                return cb.and(predicates.toArray(new Predicate[0]));
                            } else {
                                return null;
                            }
                        };
    
                        List<AucBrand> aucBrandList = aucBrandRepository.findAll(aucBrandSpec);
                        if (aucBrandList != null && aucBrandList.size() > 0) {
                            AucBrand aucBrand = aucBrandList.get(0);
                            if (aucBrand != null) {
                                boolean bailPayed = aucBrand.isBailPayed();// 保证金是否支付
                                int isDeal = aucBrand.isDeal();// 成交状态
                                int auditType = aucBrand.auditType();// 审核状态
                                map.put("bailPayed", bailPayed);
                                map.put("auditType", auditType);
                                // 获取保证金主键id值
                                List<SettlementBail> settlementBails = settlementBailRepository
                                        .findAllByBrandId(aucBrand.id());
                                if (settlementBails != null && settlementBails.size() > 0) {
                                    SettlementBail settlementBail = settlementBails.get(0);
                                    if (settlementBail != null) {
                                        map.put("settlementBailId", settlementBail.id());
                                    } else {
                                        map.put("settlementBailId", null);
                                    }
                                }
    
                                // 判断竞拍情况
                                if (bailPayed == true) {
                                    // 成交
                                    if (isDeal == 1) {
                                        auctionStatus = 1;// "已成交"
                                    } else {
                                        auctionStatus = 2;// "已参拍"
                                    }
                                } else {
                                    // 保证金未支付
                                    auctionStatus = 3;// "已报名"
                                }
                                map.put("auctionStatus", auctionStatus);
                            } else {
                                // 没有参拍资质
                                auctionStatus = 4;// "未报名"
                                map.put("bailPayed", null);
                                map.put("auditType", null);
                                map.put("settlementBailId", null);
                                map.put("auctionStatus", auctionStatus);// 竞拍情况
                            }
                        } else {
                            auctionStatus = 4;// "未报名"
                            map.put("bailPayed", null);
                            map.put("auditType", null);
                            map.put("settlementBailId", null);
                            map.put("auctionStatus", auctionStatus);// 竞拍情况
                        }
                        focusOnList.add(map);
                    } else {
                        continue;
                    }
                }
                retMap = new HashMap<String, Object>();
                retMap.put("focusOnList", focusOnList);
                retMap.put("total", total);
                return new ResultDTO<Map<String, Object>>(retMap);
            } else {
                return new ResultDTO<Map<String, Object>>(700, "用户未登录", null);
            }
        }

      SQL语句:

       

    @Query(value="SELECT a.id,a.auc_id,a.crt_time,a.crt_user_id,a.crt_user_name,a.customer_id,a.upd_time,a.upd_user_id,a.upd_user_name FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id "
                + "AND a.customer_id = ?1 AND ( b.STATUS = ?4 or b.STATUS = ?5 or b.STATUS = ?6 or b.STATUS = ?7 or b.STATUS = ?8 or b.STATUS = ?9 or b.STATUS = ?10) order by a.crt_time desc limit ?2,?3",nativeQuery=true)
        List<AucAttention> findAllByCustomerIdAndAucLotStatus(Long customerId,
                int i, int rows,int checkStatus1,int checkStatus2,int checkStatus3,int checkStatus4,int checkStatus5,int checkStatus6,int checkStatus7);
    
        
        
        @Query(value="select count(*) from (SELECT a.id FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id "
                + "AND a.customer_id = ?1 AND ( b.STATUS = ?2 or b.STATUS = ?3 or b.STATUS = ?4 or b.STATUS = ?5 or b.STATUS = ?6 or b.STATUS = ?7 or b.STATUS = ?8)) as temp",nativeQuery=true)
        int findAllCountByCustomerIdAndAucLotStatus(Long customerId,int checkStatus1,int checkStatus2,int checkStatus3,int checkStatus4,int checkStatus5,int checkStatus6,int checkStatus7);
  • 相关阅读:
    理解RESTful架构
    redis 未授权漏洞利用直接登录服务器
    初创公司应该如何做好持续集成和部署?
    Redis 作为缓存服务器的配置
    自己写的轻量级PHP框架trig与laravel5.1,yii2性能对比
    利用SecureCRT上传、下载文件(使用sz与rz命令)
    ZendStudio10 代码格式化 xml
    LESS CSS 框架简介
    为什么浏览器User-agent总是有Mozilla字样
    在 JavaScript 中 prototype 和 __proto__ 有什么区别
  • 原文地址:https://www.cnblogs.com/mr-wuxiansheng/p/6415014.html
Copyright © 2011-2022 走看看