我想弄清楚如何用Castle ActiveRecord執行自定義查詢。用Castle ActiveRecord自定義查詢
我能夠運行,返回我的實體簡單的查詢,但我真正需要的是像下面的查詢(含自定義字段集):
SELECT COUNT(1)CNT,從workstationevent數據其中serverdatetime> =:minDate和serverdatetime <:maxDate和userId = 1按數據計數(1)>閾值:閾值
謝謝!
我想弄清楚如何用Castle ActiveRecord執行自定義查詢。用Castle ActiveRecord自定義查詢
我能夠運行,返回我的實體簡單的查詢,但我真正需要的是像下面的查詢(含自定義字段集):
SELECT COUNT(1)CNT,從workstationevent數據其中serverdatetime> =:minDate和serverdatetime <:maxDate和userId = 1按數據計數(1)>閾值:閾值
謝謝!
在這種情況下,你想要的是HqlBasedQuery
。你的查詢將是一個投影,所以你將返回的元組包含結果(ArrayList的每個元素的內容將取決於查詢,但對於多個值將是object[]
)。
HqlBasedQuery query = new HqlBasedQuery(typeof(WorkStationEvent),
"select count(1) as cnt, data from workstationevent where
serverdatetime >= :minDate and serverdatetime < :maxDate
and userId = 1 group by data having count(1) > :threshold");
var results =
(ArrayList)ActiveRecordMediator.ExecuteQuery(query);
foreach(object[] tuple in results)
{
int count = (int)tuple[0]; // = cnt
string data = (string)tuple[1]; // = data (assuming this is a string)
// do something here with these results
}
您可以創建一個匿名類型以更有意義的方式保存結果。例如:
var results = from summary in
(ArrayList)ActiveRecordMediator.ExecuteQuery(query)
select new {
Count = (int)summary[0], Data = (string)summary[1]
};
現在結果將包含匿名類型與性質Count
和Data
的集合。或者你也可以創建你自己的摘要類型,並以這種方式填充它。
ActiveRecord也有ProjectionQuery
,它可以做很多相同的事情,但只能像使用HQL一樣返回實際映射的屬性而不是集合或函數。
請注意,如果您像我一樣使用ActiveRecord 1.0.3(RC3),則會導致運行時InvalidCastException。 ActiveRecordMediator.ExecuteQuery返回一個ArrayList而不是一個通用的ICollection。所以爲了使其工作,只是改變這一行:
var results = (ICollection<object[]>) ActiveRecordMediator.ExecuteQuery(query);
到
var results = (ArrayList) ActiveRecordMediator.ExecuteQuery(query);
,它應該工作。
還要注意的是,在你的HQL語句中使用計數(1)可以將查詢返回的,而不是在Object []一個ArrayList字符串的ArrayList(這是您使用count(*)時,你得到了什麼。)
只是想我會指出這是爲了將它全部記錄在一個地方。
謝謝!今晚我會試試看! – Slav 2008-12-12 09:54:30