[英]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.