×
文章路径: Java

Hibernate支持的HQL函数-HQL对Date类型数据的处理

发表于3年前(Dec 24, 2014 2:34:59 PM)  阅读 1205  评论 0

分类: Java

标签: hql CURRENT_DATE YEAR

1、问题背景:

有一个需求,统计网址访问量,需要分别统计昨天以及当月网址的访问数量。网址每次访问记录都已保存下来,访问时间使用日期时间类型,数据库是用的mysql,对应的字段类型是timestamp。其实这是一个很简单的sql,指定时间范围count一下就行了,本来系统框架使用的hibernate,也支持jdbc,但是考虑到还是保留数据库可移植性,还是使用hql来进行查询。

2、解决方案:

2.1、方案1:

以统计昨天的访问量为例,给定两个时间类型的参数,分别对应昨天零点以及今天零点的时间,采用between进行查询。(传参时,参数类型好像是用使用java.sql.Date,笔者未试验)

2.2、方案2:

网上搜索hibernate支持的函数,找到一些处理时间类型的函数,笔者就是采用该方案实现,看下面代码:

public int getLastDayVisitCount() {
	final String hql = "select count(t.logId) from VisitDetailLog t where YEAR(t.visitTime)=YEAR(CURRENT_DATE()) and MONTH(t.visitTime)=MONTH(CURRENT_DATE()) and DAY(t.visitTime)=DAY(CURRENT_DATE())-1";
	List list = getHibernateTemplate().executeFind(new HibernateCallback() {
		public Object doInHibernate(Session session)
				throws HibernateException, SQLException {
			Query query = session.createQuery(hql);
			List result = query.list();
			return result;
		}
	});
	if(list!=null&&list.size()>0) {
		return Integer.parseInt(list.get(0).toString());
	} else {
		return 0;
	}
}

其中CURRENT_DATE()函数是获得数据库当前日期,YEAR就是获得指定日期参数对应的年份,MONTH,DAY就不用说了,再结合CURRENT_TIME(),HOUR等函数,就覆盖了所有时间类型的处理。

3、网上找的hibernate支持的HQL函数列表:

发表评论