2011-03-17 73 views
1

我在SQLHQL與轉換時區

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; 

我在遷移這一切休眠的過程中,下面的查詢,我都與此相關的兩個問題,

  1. 我怎樣才能在HQL中寫入相同的查詢?
  2. 可以休眠緩存(ehcache)緩存原生SQL,它是如何工作的。這將是巨大的,如果someon可以點我到正確的方向,瞭解本地SQL的查詢緩存

問候, 羅希特

回答

0

這是一個非常複雜的問題,因爲有幾件事情需要考慮。你的查詢的「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> 
+0

它發生,我認爲這可能是更容易只是創建自定義函數自己,是雙方的DATE_FORMAT和CONVERT_TZ功能,以防萬一組合NHibernate的迷糊。這裏有一些註釋:http://stackoverflow.com/questions/1845884/custom-sql-function-for-nhibernate-dialect。如果有興趣,我可以添加一個片段。 – 2011-10-28 19:21:27