JPA解决时间类型不一致导致索引不生效 二

418 阅读1分钟

一 问题

java Date类型与数据库类型不一致导致索引不生效

二 解决

上篇文章,通过加注解的形式使索引生效,但是出现了另一个问题,加注解后,时间的精度只有年月日,而没有时分秒,这显然是不行了,于是查看相关的解决方案

三 多方案解决

  1. 将数据库的时间改成timestamp

    改成timestamp后数据库有了时分秒的精度,但是因为是改了字段的类型,可能存在一定的问题

  2. 通过 cast函数

cast ( 字段 as date) 将输入的参数转换成date类型,但是在jpa框架的使用中却没有生效,所以没有这一方案

  1. 将页面传入的时间类型转换成字符串类型,在通过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';  
执行结果

image.png

这里就可以清晰的看到,查询语句走了全表扫描。