2010-04-17 46 views
0

为什么Nibernate HQL不能处理下面的查询:NHibernate和MySQL的关键词

from Deal D where (D.ApprovalDate + INTERVAL 1 Year) < current_timestamp() < (D.RenewalDate + INTERVAL -1 Year) 

知道该时间间隔和年在MySQL中的关键字,所以这是一种内HQL混合SQL(除非HQL可以处理日期功能像这样,我不知道)。方言是MySQLDialect

它完全有效的执行这个查询

SELECT '2005-01-01' + INTERVAL 1 Year; 
+1

您是否想使用hql或sql?原谅我,如果我不明白这件事的一些事情,但是你有意在hql中使用sql吗?我不确定你是否可以做到这一点 – 2010-04-17 20:58:29

+0

你使用的是正确的方言?例如MySQL5Dialect – 2010-04-17 20:59:17

+1

我相信你可以,HQL应该将任何非转换的字符串传递给数据库引擎来计算它......至少这就是文档所说的 – 2010-04-17 21:05:54

回答

1

您可以使用标准查询查询直接传递SQL。像这样的东西

Session.CreateCriteria<Deal>() 
.Add(Restrictions.Sql(D.ApprovalDate + " INTERVAL 1 Year < current_timestamp() < " + D.RenewalDate + " INTERVAL -1 Year") 

Restrictions.Sql会将你直接给它的任何东西作为sql传递给数据库。

+0

感谢这个提议,但我是动态构建HQL查询。我会研究这个解决方案,但是你认为有什么强大的功能可以和hql一起工作吗? – 2010-04-18 17:15:37

+0

我很好奇你选择HQL的原因。标准查询编译到HQL,所以它可能做你正在尝试,但我从来没有想出如何。我有类似的问题需要直接传递Sql并最终使用Criteria。你是否被迫使用HQL? – Adam 2010-04-19 17:18:33

+0

呃,不!但是,如果融化到hql,我不知道这是怎样的hql看起来像:) ...再次感谢您的巨大努力 – 2010-04-19 17:31:29