分配到这样一个需求,让我实现一个后台页面,不仅仅有条件搜索还有一些添加过滤。
我琢磨着,又可以复制粘贴了,按照之前大佬的模板去搜索,后面排查确认了一下,完蛋了,有一些搜索字段是要另一个数据库里。
意味着要跨库联合查询,大佬说,如果跨库联合查询,难度大性能会下降很多,建议冗余字段。
也就是在一张主表里冗余这些多余的字段。
1、先找到这些原有数据的来源,进行后续数据同步,也就是所谓的维护。
2、后期要修复数据,毕竟是新增的,得写一条SQL修补数据(当然,别忘记先增加SQL字段)
eg:update A表 a inner join D库
.C表 c on a.id = c.id set s.字段=c.字段 , s.字段=c.字段;
二、条件搜索之日期
需求里面:筛选新增【日期】,最多31天
理论上来说,前端传一个字符串格式的时间给我即可,如:2019-8-27
但后端得特殊处理,比如开始时间和结束时间,后面必须精确到秒,如果前端传来开始和结束都为 2019-8-27。
那么后端必须处理成:2019-8-27 00:00:00 和 2019-8-27 23:59:59
由现成的工具类可以实现 :
* 取一天最大的时间
*
* @param date
* @return
*/
public static Date ceiling(Date date) {
if (date == null) {
return null;
}
SimpleDateFormat sm = new SimpleDateFormat("yyyy-MM-dd");
String day = sm.format(date) + " 23:59:59";
return parseStringToDate(day, "yyyy-MM-dd HH:mm:ss");
}
/**
* 取一天最小的时间
*
* @param date
* @return
*/
public static Date floor(Date date) {
if (date == null) {
return null;
}
SimpleDateFormat sm = new SimpleDateFormat("yyyy-MM-dd");
String day = sm.format(date) + " 00:00:00";
return parseStringToDate(day, "yyyy-MM-dd HH:mm:ss");
}
三、多条件过滤筛选
image.png这种查询的情况比较多种,要考虑可能为空,模糊查询等。
假设这些数据都是在同一张表里,可以写一个 DTO 类封装返回数据,例如:
"select new DTO 类(数据1,数据2,数据3,....) from S表 s where (?1 is null or s.id= ?1 ) and (?2 is null or (s.字段2 like concat('%',?2,'%'))) and (?3 is null or (s.字段3 like concat('%',?3,'%'))) and " +
"(s.字段4= ?4 or ?4 is null) and (?5 is null or s.时间字段 >= ?5) and (?6 is null or s.时间字段 <= ?6) and (s.字段7= ?7 or ?7 is null) and s.deleted = 0")
网友评论