2010-10-31 43 views
1

我有以下結構。NHibernate:無關聯的LeftOuterJoin

消息(文本)

MessageReading(消息,用戶)

我想和如果存在 它對應MessageReading加載消息。 我可以做到這一點與HQL:

var query = session.CreateSQLQuery( 
@"SELECT {msg.*}, {mr.*} 
    FROM Message msg 
    LEFT OUTER JOIN MessageReading mr ON (mr.Message_Id = msg.Id AND 
    mr.User_Id = :user)") 
.AddEntity("msg", typeof(Message)) 
.AddEntity("mr", typeof(MessageReading)) 
.SetParameter("user", user.Id); 

有沒有辦法做標準API一樣嗎? (我需要它,因爲我 使用Rhino安全性來爲我的查詢添加授權過濾)

回答

1

首先,在您的示例中,您正在使用RDBMS底層方言執行SQL查詢,而不是HQL查詢。這就是爲什麼你可以在你的NHibernate配置中沒有關聯映射的情況下進行連接。要執行HQL查詢,您可以使用session.CreateQuery方法。

要使用HQL或Criteria API執行此查詢,需要從Message類到MessageReading類的一對多<set name="Readings" ...>映射。消息類應該有Readings類型的屬性ISet<MessageReading>。 有了這個映射的地方,你將能夠使用Criteria API,像這樣:

var criteria = session.CreateCriteria<Message>); 
criteria.CreateAlias("Readings", "mr", JoinType.LeftOuterJoin); 
criteria.Add(Restrictions.Eq("User", user)); 
criteria.SetResultTransformer(Transformers.DistinctRootEntity); 

var results = criteria.List<Message>(); 

這將返回Message對象的列表,並填充讀數屬性中的每個對象。 DistinctRootEntity變換器確保即使有多個MessageReadings也只返回每個Message對象的一個​​副本。

+0

你說得對,我有SQL查詢,而不是HQL之一。然而,問題的本質仍然是相同的:) 感謝您的想法!我會試一試。 – 2010-11-01 06:57:31