2010-04-17 40 views
0

爲什麼Nibernate HQL不能處理下面的查詢:NHibernate和MySQL的關鍵詞

from Deal D where (D.ApprovalDate + INTERVAL 1 Year) < current_timestamp() < (D.RenewalDate + INTERVAL -1 Year) 

知道該時間間隔和年在MySQL中的關鍵字,所以這是一種內HQL混合SQL(除非HQL可以處理日期功能像這樣,我不知道)。方言是MySQLDialect

它完全有效的執行這個查詢

SELECT '2005-01-01' + INTERVAL 1 Year; 
+1

您是否想使用hql或sql?原諒我,如果我不明白這件事的一些事情,但是你有意在hql中使用sql嗎?我不確定你是否可以做到這一點 – 2010-04-17 20:58:29

+0

你使用的是正確的方言?例如MySQL5Dialect – 2010-04-17 20:59:17

+1

我相信你可以,HQL應該將任何非轉換的字符串傳遞給數據庫引擎來計算它......至少這就是文檔所說的 – 2010-04-17 21:05:54

回答

1

您可以使用標準查詢查詢直接傳遞SQL。像這樣的東西

Session.CreateCriteria<Deal>() 
.Add(Restrictions.Sql(D.ApprovalDate + " INTERVAL 1 Year < current_timestamp() < " + D.RenewalDate + " INTERVAL -1 Year") 

Restrictions.Sql會將你直接給它的任何東西作爲sql傳遞給數據庫。

+0

感謝這個提議,但我是動態構建HQL查詢。我會研究這個解決方案,但是你認爲有什麼強大的功能可以和hql一起工作嗎? – 2010-04-18 17:15:37

+0

我很好奇你選擇HQL的原因。標準查詢編譯到HQL,所以它可能做你正在嘗試,但我從來沒有想出如何。我有類似的問題需要直接傳遞Sql並最終使用Criteria。你是否被迫使用HQL? – Adam 2010-04-19 17:18:33

+0

呃,不!但是,如果融化到hql,我不知道這是怎樣的hql看起來像:) ...再次感謝您的巨大努力 – 2010-04-19 17:31:29