一千萬個為什麽

搜索

使用NHibernate的HQL進行多個內部聯接的查詢


這裏的問題包括將用LINQ編寫的語句轉換為SQL語法,轉換為NHibernate的等價語句。 LINQ to SQL代碼如下所示:

var whatevervar = from threads in context.THREADs
                          join threadposts in context.THREADPOSTs
                            on threads.thread_id equals threadposts.thread_id
                          join posts1 in context.POSTs
                            on threadposts.post_id equals posts1.post_id
                          join users in context.USERs
                            on posts1.user_id equals users.user_id
                          orderby posts1.post_time
                          where threads.thread_id == int.Parse(id)
                          select new
                          {
                              threads.thread_topic,
                              posts1.post_time,
                              users.user_display_name,
                              users.user_signature,
                              users.user_avatar,
                              posts1.post_body,
                              posts1.post_topic
                          };

它本質上是試圖獲取給定論壇帖子中的帖子列表。我能夠為NHibernate提供的最好的(在本網站的有用用戶的幫助下)是:

var whatevervar = session.CreateQuery("select t.Thread_topic, p.Post_time, " +
                                              "u.User_display_name, u.User_signature, " +
                                              "u.User_avatar, p.Post_body, p.Post_topic " +
                                              "from THREADPOST tp " +
                                              "inner join tp.Thread_ as t " +
                                              "inner join tp.Post_ as p " +
                                              "inner join p.User_ as u " +
                                              "where tp.Thread_ = :what")
                                              .SetParameter<thREAD>("what", threadid)
                                              .SetResultTransformer(Transformers.AliasToBean(typeof(MyDTO)))
                                              .List();

但這並不能解析,抱怨連接表的別名是空引用。 MyDTO是輸出的自定義類型:

public class MyDTO
{
    public string thread_topic { get; set; }
    public DateTime post_time { get; set; }
    public string user_display_name { get; set; }
    public string user_signature { get; set; }
    public string user_avatar { get; set; }
    public string post_topic { get; set; }
    public string post_body { get; set; }
}

我沒有想法,雖然通過直接SQL查詢這樣做是可能的,但我想在不破壞使用ORM的目的的情況下正確地做到這一點。

提前致謝!

編輯:

數據庫如下所示: http://i41.tinypic.com/5agciu.jpg (無法發布圖片。)

最佳答案

當我希望HQL查詢返回自定義類型時,就像你一樣,我總是這樣做:

select new MyDTO (t.Thread_Topic, p.Post_time, u.User_Display_Name, .... ) 
from ...

我將不得不檢查我的一些代碼,但我認為在這種情況下我甚至不使用AliasToBeenTransformer。 我不知道,因為我主要使用NHibernate的ICriteria API(當使用這個時,你確實需要在執行這種操作時指定resulttransformer)。

註意:我覺得在屬性名稱中看到下劃線很奇怪(或者說很尷尬)......

轉載註明原文: 使用NHibernate的HQL進行多個內部聯接的查詢

猜你喜歡