2

SQLで次のクエリがあります

Select 
count(*) as cnt, 
DATE_FORMAT(CONVERT_TZ(wrdTrk.createdOnGMTDate,'+00:00',:zone),'%Y-%m-%d') as dat
 from
 t_twitter_tracking wrdTrk 
where 
wrdTrk.word like (:word) and wrdTrk.createdOnGMTDate  between  :stDate and :endDate  group by dat;

私はこれらすべてをHibernateに移行する過程にあります。これに関連して、2つの質問があります。

  1. HQLで同じクエリを作成するにはどうすればよいですか?
  2. ネイティブSQLを休止状態キャッシュ(ehcache)キャッシュでき、どのように機能しますか。誰かがネイティブSQLクエリのキャッシュを理解するための正しい方向を教えてくれるといいですね

よろしく、Rohit

4

1 に答える 1

2

考慮すべきことがいくつかあるため、これは非常に複雑な質問です。クエリの「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>
于 2011-10-28T19:17:15.183 に答える