将查询转换为HQL

时间:2013-10-10 10:11:20

标签: sql-server hibernate hql

我是HQL的新手,我需要进行以下MSSQLServer查询,以便在所有数据库中执行每月和每年的销售,

select count(sales) as monthsales from salesdairy where propertytype in ('item1') and MONTH(time) = MONTH(getdate())
select count(sales) as yearsales from salesdairy where propertytype in ('item1') and YEAR(time) = YEAR(getdate())

我使用函数MONTH(time) = MONTH(getdate()),YEAR(time) = YEAR(getdate())来解决HQL中是否有任何等价物。 如果有人能给我HQL等价物,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

在HQL而不是表中你有实体(类对象)。 我想你的桌子销售商变成了SalesDiary实体。

首先查询:

select count(S.id)
from SalesDiary S
where S.propertytype in ('item1')
and MONTH(S.time) = MONTH(current_date)

第二次查询:

select count(S.id)
from SalesDiary S
where S.propertytype in ('item1')
and YEAR(S.time) = YEAR(current_date())

函数MONTH获取输入日期的月份数,YEAR函数获取输入日期的年份数。

current_date()等同于SQL Server GETDATE()。

评论后编辑 很奇怪,Hibernate必须使用下划线DBMS的正确函数进行转换。

如果你可以使用参数试试这个:

select count(S.id)
from SalesDiary S
where S.propertytype in ('item1')
and YEAR(S.time) = YEAR(:currDate)

当您将HQL查询提供给对象Query时,您将以这种方式用setDate函数替换您的currDate参数:

String hql = 
  "select count(S.id)
  from SalesDiary S
  where S.propertytype in ('item1')
  and YEAR(S.time) = YEAR(:currDate)";

Query q = session.createQuery(hql);

q.setDate("currDate", new GregorianCalendar().getTime());
q.list();

我希望现在没问题;)