C# 使用NHibernate';s HQL使用多个内部联接进行查询
这里的问题包括将用LINQ到SQL语法编写的语句转换为NHibernate的等效语句。LINQ to SQL代码如下所示:C# 使用NHibernate';s HQL使用多个内部联接进行查询,c#,.net,nhibernate,orm,hql,C#,.net,Nhibernate,Orm,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.thre
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>();
我已经没有主意了,虽然通过直接SQL查询来实现这一点是可能的,但我希望能够正确地实现这一点,而不会破坏使用ORM的目的
提前谢谢
编辑:
数据库如下所示:(还不能发布图像。)当我希望HQL查询返回自定义类型时,就像您一样,我总是这样做:
select new MyDTO (t.Thread_Topic, p.Post_time, u.User_Display_Name, .... )
from ...
我必须检查我的一些代码,但我认为在这种情况下我甚至不使用AliasToBeenTransformer。
我不太清楚,因为我主要使用NHibernate的ICriteria API(当使用这个API时,在执行此类操作时确实需要指定resulttransformer)
注意:我发现在属性名中看到下划线很奇怪(或者相当尴尬)…HQL是对对象的查询,而不是对表的查询 在HQL中,我看到类tp和该类的属性tp.Thread\之间的连接。您应该在这里区分SQL和HQL。将HQL视为对对象TP的查询,而不是对底层表结构的查询。您能发布您的域模型(对象之间的关系)以便我们可以帮助您吗 谢谢你的照片。但是:看起来您的对象是表的副本,我不认为这就是您的想法?例如:我本以为线程和帖子之间的多对多关系应该使用Hibernate进行映射。如果是这样的话,您可以将线程与post连接起来,而不必麻烦处理中间对象threadpost,它实际上只是保存这些对象之间的关系,对吗 换言之;使用帖子列表装饰线程对象,并使用线程列表装饰帖子对象 [装饰]
也就是说,将线程列表作为属性放在post类上,并将帖子列表作为属性放在threads类上。您需要的是nhibernate映射文件的多对多关系。这意味着您不需要映射类中的多对多表,只需映射post和thread类的关系。奇怪的名称是由NConstruct-Lite生成的XML产生的,我使用它生成ORM文件等等。主键从“smth_id”更改为“id”,外键从“smth_id”更改为“smth_id”。我不知道NHibernate的HQL在没有中间表的情况下能够实现这种关系——我知道,如果不指出THREADPOST持有线程和POST之间的关联,我无法在常规SQL中实现这一点。我不知道你说的“装饰”是什么意思。你能解释一下吗?他所说的装饰是指除了直接表属性之外,还要向实体类添加更多内容。因此,一个用户有多个帖子,所以将IList添加到您的用户类中,等等。
select new MyDTO (t.Thread_Topic, p.Post_time, u.User_Display_Name, .... )
from ...