我基本上是試圖創建此查詢與NHibernate的ICriteria接口JOINňAnotherTableNHibernate的2.1:</p> <p>SomeTable 1:LEFT與別名(的ICriteria)子查詢
SomeTable有列:PrimaryKey的,NonAggregateColumn
AnotherTable有列:PrimaryKey的,ForeignKey的,AnotherNonAggregate,YetAnotherNonAggregate
SELECT
table1.NonAggregateColumn,
subquery.SubQueryAggregate1,
subquery.SubQueryAggregate2
FROM
SomeTable AS table1
LEFT JOIN
(
SELECT
table2.ForeignKey,
COUNT(table2.AnotherNonAggregate) AS SubQueryAggregate1,
AVG(table2.YetAnotherNonAggregate) AS SubQueryAggregate2
FROM AnotherTable AS table2
GROUP BY (table2.ForeignKey)
) AS subquery ON subquery.ForeignKey = table1.PrimaryKey
很明顯,使用Projection子查詢效率不高,因爲SQL必須對錶進行兩次掃描(每個聚合一個投影子查詢)。
使用多個GROUP BY也不夠高效。
有沒有解決方案呢?到目前爲止,我一直在使用原始SQL,但對於複雜的報表來說這變得很難處理。
你能澄清你的問題嗎?您顯示的查詢是原生sql。它是否已經返回了預期的數據?你想把它變成標準。爲什麼不HQL? – 2009-09-03 14:31:06
忘記提及:您正在使用ORM。因此,編寫一個查詢,你不必太在意表和外鍵。實體和映射定義更爲重要。那麼這些表格如何映射? SomeTable中是否有列表? AnotherTable中有參考嗎?或兩者? – 2009-09-03 14:32:43
是的,原始查詢返回報告所需的數據。我正在使用NHibernate 2.1。 Criteria API是首選,因爲通過NHLambdaExtensions(我也在使用它)的強打字能力。 我正在使用名稱SomeTable,AnotherTable來使SQL清晰易讀。這是一個真實物體的虛構鏡子。 SomeTable映射對象具有AnotherTable對象的反向一對多集合。 – 2009-09-03 14:38:15