考慮すべきことがいくつかあるため、これは非常に複雑な質問です。クエリの「AS」の部分は、NHibernate によって取り除かれ、独自に作成されるため、HQL では無視されます。残念ながら、これはクエリが醜くなることを意味します。「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>