一次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);
原文地址:https://www.cnblogs.com/mr-wuxiansheng/p/6415014.html