首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Hibernate自定义日期函数方言,加快查询速度

Hibernate自定义日期函数方言,加快查询速度
EN

Stack Overflow用户
提问于 2015-11-28 02:04:22
回答 1查看 748关注 0票数 1

我的应用程序的数据库有许多记录(200万条),我有几个查询,它们使用DATE()函数在日期字段中使用WHERE条件。示例:

代码语言:javascript
复制
SELECT * from table WHERE DATE(column1)>=DATE(:parameter1) and DATE(column1)<=DATE(:parameter2)

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

代码语言:javascript
复制
SELECT * from table WHERE column1>=:parameter1 and column1<=:parameter2

其中parameter1是时间为00:00:00的日期,parameter2是时间为23:59:59的日期,查询仅需1/2ms。

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

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

你有什么好的建议以一种“最佳实践”的方式做到这一点吗?

sql解决方案是必需的,因为在没有Java实现的带有@Query注释的Spring服务的情况下,它也更好:

代码语言:javascript
复制
@Query(value = "SELECT * from table WHERE DATE(column1)>=DATE(?1) and DATE(column1)<=DATE(?2)")
 public List<MyObject> findByDate(Date date1,Date date2);

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

EN

回答 1

Stack Overflow用户

发布于 2015-11-28 02:31:21

我建议你用下面的java代码创建一个方法,并在你想要为你的查询定义初始和结束时间的任何时候重用它:

代码语言:javascript
复制
    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());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33962766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档