Это действительно сложный вопрос, потому что нужно учитывать несколько вещей.Часть «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 и т. д., и т. д., и т. д.
Если это не так, вам нужно зарегистрировать их самостоятельно с помощью этого кода.
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>