一 问题
java Date类型与数据库类型不一致导致索引不生效
二 解决
上篇文章,通过加注解的形式使索引生效,但是出现了另一个问题,加注解后,时间的精度只有年月日,而没有时分秒,这显然是不行了,于是查看相关的解决方案
三 多方案解决
-
将数据库的时间改成timestamp
改成timestamp后数据库有了时分秒的精度,但是因为是改了字段的类型,可能存在一定的问题
-
通过 cast函数
cast ( 字段 as date) 将输入的参数转换成date类型,但是在jpa框架的使用中却没有生效,所以没有这一方案
-
将页面传入的时间类型转换成字符串类型,在通过to_date()函数转换成date类型
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if (this.model().criteria.beginPrintedDate!= null) { String format = sdf.format(this.model().criteria.beginPrintedDate); this.model().criteria.beginPrintedDateStr =format; } if (this.model().criteria.endPrintedDate!= null) { String format = sdf.format(this.model().criteria.endPrintedDate); this.model().criteria.endPrintedDateStr =format; }通过这种形式,解决了没有走索引的问题,而且保留了时间精度
四 测试手法
很多时候工作的效率和对自己功能测试的效率是分不开的,比如如果熟悉业务,那么就很容易造成想要的测试数据,如果熟悉自动化测试,也能提高测试的效率。 说一说这次功能的测试,如果判定SQL走了索引,普通的方式就是查看执行的速度,但是有没有另一种方式看它有没有走索引呢,答案是有的
-- 查询数据库执行过得SQL语句
SELECT sql_id,sql_text, last_load_time,HASH_VALUE
FROM v$sql
WHERE last_load_time IS NOT NULL and sql_text like '%test_table%'
ORDER BY last_load_time DESC;
-- 通过SQL语句的HASH_VALUE得到语句的执行计划
select * from v$sql_plan t where t.HASH_VALUE = '1829764115';
执行结果
这里就可以清晰的看到,查询语句走了全表扫描。