繁体   English   中英

休眠自定义方言的DATE功能以加快查询速度

[英]Hibernate custom dialect for DATE function to speed up queries

我的应用程序的数据库有很多记录(2百万次),我有几个查询使用DATE()函数在日期字段上使用WHERE条件。 例:

SELECT * from table WHERE DATE(column1)>=DATE(:parameter1) and DATE(column1)<=DATE(:parameter2)

这些查询花费太多时间:大约150 / 170ms。 经过一些分析后,我发现问题出在DATE()函数上。 将查询转换为:

SELECT * from table WHERE column1>=:parameter1 and column1<=:parameter2

其中parameter1是具有00:00:00时间的日期,而parameter2是具有23:59:59时间的日期,查询仅花费1 / 2ms。

因此,我应该翻译我的应用程序中的所有HQL查询,但是我想尝试在Hibernate方言中使用自定义函数来完成这项工作。

例如,创建一个DATE_START()函数将查询日期与00:00:00的时间和DATE_END()函数将查询日期与23:59:59的时间。

您是否有一些好的建议以“最佳实践”方式做到这一点?


需要一个sql解决方案,因为对于没有Java实现的带有@Query注释的Spring服务,它也更好:

@Query(value = "SELECT * from table WHERE DATE(column1)>=DATE(?1) and DATE(column1)<=DATE(?2)")
 public List<MyObject> findByDate(Date date1,Date date2);

在这些情况下,我不能使用Java解决方案。

我想说的是,您可以使用下面的Java代码创建一个方法,并在需要为查询定义初始和最终时间的任何时间重复使用:

    Calendar initialCalendar = GregorianCalendar.getInstance();
    initialCalendar.setTime(dataInicial);
    initialCalendar.set(Calendar.HOUR_OF_DAY, 0);
    initialCalendar.set(Calendar.MINUTE, 0);
    initialCalendar.set(Calendar.SECOND, 0);
    initialCalendar.set(Calendar.MILLISECOND, 0);

    Calendar finalCalendar = GregorianCalendar.getInstance();
    finalCalendar.setTime(dataFinal);
    finalCalendar.set(Calendar.HOUR_OF_DAY, 23);
    finalCalendar.set(Calendar.MINUTE, 59);
    finalCalendar.set(Calendar.SECOND, 59);
    finalCalendar.set(Calendar.MILLISECOND, 999);

    Timestamp inicialDate = new Timestamp(initialCalendar.getTimeInMillis());
    Timestamp finalDate = new Timestamp(finalCalendar.getTimeInMillis());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM