这是一个非常复杂的问题,因为有几件事情需要考虑。你的查询的“AS”部分在HQL中被忽略,因为NHibernate将它剥离并创建它自己的。不幸的是,这意味着查询变得很难看。你会发现,从长远函数开始“DATE_FORMAT(CONVERT_TZ”需要在GROUP要重复BY查询的部分。
string hql = @"SELECT
count(*),
date_format(
convert_tz(wrdTrk.createdOnGMTDate,
'+00:00', :zone),'%Y-%m-%d')
FROM
t_twitter_tracking wrdTrk
WHERE
wrdTrk.word LIKE (:word)
AND wrdTrk.createdOnGMTDate
BETWEEN :stDate and :endDate
GROUP BY
date_format(
convert_tz(wrdTrk.createdOnGMTDate,
'+00:00',:zone),'%Y-%m-%d')";
var list = session.CreateQuery(hql)
.SetParameter("zone", zone)
.SetParameter("word", word)
.SetParameter("stDate", stDate)
.SetParameter("endDate", endDate)
.List<object[]>();
foreach (var item in list)
{
int count = (int)item[0];
DateTime date = (DateTime)item[1];
Console.WriteLine("Count: {0}, Date: {1}", count, date.ToString());
}
不幸的是你的工作可能没有结束。你可能会得到这个错误,如果在“DATE_FORMAT”或“CONVERT_TZ”功能没有在MySQLDialect类注册
节点无数据类型:MethodNode((DATE_FORMAT等,等,等
如果他们没有,那么你需要用t自己注册它们他的代码。
public class MyDialect : MySQL5Dialect
{
public MyDialect()
{
RegisterFunction("date_format",
new StandardSQLFunction(NHibernateUtil.Date, "date_format(?1, ?2)"));
RegisterFunction("convert_tz",
new StandardSQLFunction(NHibernateUtil.Date, "convert_tz(?1, ?2, ?3)"));
}
}
然后,你需要像下面的“的hibernate.cfg.xml”文件注册您的自定义方言(“NS1”是只为你命名的占位符)。
<property name="dialect">Ns1.MyDialect, MyProgram</property>
它发生,我认为这可能是更容易只是创建自定义函数自己,是双方的DATE_FORMAT和CONVERT_TZ功能,以防万一组合NHibernate的迷糊。这里有一些注释:http://stackoverflow.com/questions/1845884/custom-sql-function-for-nhibernate-dialect。如果有兴趣,我可以添加一个片段。 – 2011-10-28 19:21:27