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);

一次SQL查询语句的优化的更多相关文章

  1. 深入MySQL(四):MySQL的SQL查询语句性能优化概述

    关于SQL查询语句的优化,有一些一般的优化步骤,本节就介绍一下通用的优化步骤. 一条查询语句是如何执行的 首先,我们如果要明白一条查询语句所运行的过程,这样我们才能针对过程去进行优化. 参考我之前画的 ...

  2. SQL查询语句优化的实用方法

    查询语句的优化是SQL效率优化的一个方式,可以通过优化sql语句来尽量使用已有的索引,避免全表扫描,从而提高查询效率.最近在对项目中的一些sql进行优化,总结整理了一些方法. 1.在表中建立索引,优先 ...

  3. 浅谈SQL优化入门:1、SQL查询语句的执行顺序

    1.SQL查询语句的执行顺序 (7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_ ...

  4. sql查询语句优化

    http://www.cnblogs.com/dubing/archive/2011/12/09/2278090.html 最近公司来一个非常虎的dba  10几年的经验 这里就称之为蔡老师吧 在征得 ...

  5. 高性能MySql进化论(十一):常见查询语句的优化

    总结一下常见查询语句的优化方式 1        COUNT 1.       COUNT的作用 ·        COUNT(table.filed)统计的该字段非空值的记录行数 ·         ...

  6. oracle中sql查询语句的执行顺序

    查询语句的处理过程主要包含3个阶段:编译.执行.提取数据(sql查询语句的处理主要是由用户进程和服务器进程完成的,其他进程辅助配合) 一.编译parse 在进行编译时服务器进程会将sql语句的正文放入 ...

  7. MySQL 笔记整理(1) --基础架构,一条SQL查询语句如何执行

    最近在学习林晓斌(丁奇)老师的<MySQL实战45讲>,受益匪浅,做一些笔记整理一下,帮助学习.如果有小伙伴感兴趣的话推荐原版课程,很不错. 1) --基础架构,一条SQL查询语句如何执行 ...

  8. 【转】同一个SQL查询语句,为什么使用到的索引不同?

    问: 同一个SQL查询语句,只是修改where条件中的一个值,为什么使用到的索引情况也会不同?谢谢! 1) explain执行结果,如下图: 2) 表中的数据如下图: 3) 表结构如下图: 4) 创建 ...

  9. Oracle执行SQL查询语句的步骤

    Oracle执行SQL查询语句的步骤 如果用户在SQL*Plus下输入了如下查询语句:SELECT * FROM dept: 查询语句的处理主要包括三个过程:编译(parse).执行(execute) ...

随机推荐

  1. scala学习6--collection

     list的下标访问 var t = List(1,2,3,5,5) println(t(2)) map函数 println(t.map(a=> {print("***"+a ...

  2. ADO.NET Connection Pooling at a Glance

    ADO.NET Connection Pooling at a Glance Establishing a connection with a database server is a hefty a ...

  3. CentOS下Redis安装与配置

    本文详细介绍redis单机单实例安装与配置,服务及开机自启动.如有不对的地方,欢迎大家拍砖o(∩_∩)o (以下配置基于CentOS release 6.5 Final, redis版本3.0.2 [ ...

  4. centos7-硬盘坏道检测

    #检测坏道命令,结果输出到 /home/badblocks.log badblock -s -v -o /home/badblocks.log /dev/sdb1 [注]:硬盘损坏程度不同,block ...

  5. 通过openURL的方式启动其它App

    假设有两个App,项目名分别是SampleA和SampleB,需要在SampleA里点击一个Button来启动SampleB,并传递一个字符串.具体实现步骤如下: 1. 在SampleB的info.p ...

  6. 基于python中staticmethod和classmethod的区别(详解)

    例子 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 class A(object):   def foo(self,x):     print "executing foo ...

  7. Makefile-函数patsubst

    比方说你在makefile里定义了一个变量,内容是一堆 .c 文件的的名字,如 SRC = aaa.c bbb.c my.c his.c你可以用 patsubst 根据某种模式,将这些名字改成另外的, ...

  8. bzoj1003 trans DP

    最初的印象是网络流之类的东西,但好像不是. 想了一下,没什么思路,就网上看了一下,有人说是DP,然后就自己想DP的做法,最开始想的状态是:dp[n][s] 第n天走s这条路,前n天最小的代价,但发现路 ...

  9. 安卓中AsyncTask的基本使用

    安卓中AsyncTask的基本使用 使用场景介绍 在安卓开发中,我们经常需要访问互联网资源,这些访问是都需要在后台线程中去完成的,因为安卓的UI线程不允许执行耗时任务.然而,后台线程是不可以修改安卓的 ...

  10. PHP 日期的加减