使用NHibernate的HQL,使多个内部连接的查询

问题描述 投票:1回答:2

这里的问题在于翻译写在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>();

但是,这并不解析很好,抱怨的连接表的别名是空引用。 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(还不能发表图片。)

c# .net nhibernate orm hql
2个回答
0
投票

当我想要一个HQL查询返回一个自定义类型,像你一样,我总是做这样的:

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

我会检查我的一些代码,但我认为,我甚至不使用AliasToBeenTransformer在这种情况下。我不通过心脏知道,因为我一直都用NHibernate的的ICriteria API(使用这个时候,你确实需要在执行这类操作时指定使用ResultTransformer)。

注:我觉得很奇怪(或相当尴尬)看到财产名下划线...


0
投票

HQL是你的对象查询,而不是你的表!

在你的HQL我看到了TP类和类,tp.Thread_的属性之间的联接。你应该SQL和HQL有区别。 HQL看作物体TP而不是在基本表结构的查询。你可以发表你的域模型(你的对象之间的关系),以便我们可以帮你?

感谢您的图片。但是:它看起来像你的对象是你的表的副本,我不认为那是你脑子里想的是什么?例如:我本来以为线程和岗位之间的许多一对多的关系,将使用Hibernate已经映射。如果是的话,你可以加入与职位线程,而不必与中间对象threadpost,这,其实只是持有这些对象之间的关系,正确打扰?

换一种说法;与职位名单装点你的线程对象,并使用线程的列表装饰后的对象。

[装修]那就是把线程的列表作为您的文章类的属性,并把职位名单上你的线程类的属性。你要找的是NHibernate的映射文件的许多一对多的关系。这意味着你不需要很多一对多的表映射的一类,只图后和线程类的关系。

© www.soinside.com 2019 - 2024. All rights reserved.