我有一个查询,其中包含在select子句中:
d1.id,
d1.title,
d1.original_doc,
d2.id,
d2.title
在from子句中:
left outer join documents d2 on d1.original_doc = d2.id
假设在数据库中我有以下行:
ID TITLE ORIGINAL_DOC
1 Title1
2 Title2 1
对于第一行,NHibernate将返回1,Title1,null,1,Title1,而不是1,Title1,null,null,null。
对于第二行,它将返回2,Title2、1、2,Title2,而不是2,Title2、1、1,Title1。
请注意,第三和第四列不应包含不同的值,因为联接的条件是它们相同。 似乎正在发生的事情是,我连接的是与d2相同的d1行,而不是条件所定义的行。
现在很奇怪的部分:如果我打开.ShowSql()并将查询复制粘贴到Oracle Toad中,它实际上会返回正确的结果!
我通过使用var data = session.CreateSQLQuery(selectQuery).List()获得NHibernate中的结果集
任何人有任何想法吗?
我确切地将此报告为错误,但这不是错误。 NH使用列名在内部管理结果。 如果它们具有相同的名称,它将选择第一个。 您需要在select子句中为其赋予唯一的名称:
SELECT
d1.id as id1,
d1.title as title1,
d1.original_doc as original_doc1,
d2.id as id2,
d2.title as title2
谢谢,做到了!对于NHibernate来说,这似乎很弱,它返回与面对完全相同的查询时DB返回的结果不同的结果。我什至不介意出错,但是偷偷地返回错误的结果确实很糟糕。这根本不是必要的限制。 :/当您考虑它时,这显然是一个错误。
我也是这样。您可以根据需要在jira中添加一些评论。添加一个新的"功能增强"类型可能会更好。只是对吉拉有礼貌,那里有些人很敏感...
+1报告错误ID,这使我得出结论,该错误对nhibernate而言不是"错误",我应该在查询中使用相同的拼写来重命名列名称。
如何忍受这个"不是虫子"?我的情况是,用户以sql输入,他想要正确的结果。我应该跳过使用nhibernate还是更好的方法?现在有方法可以覆盖此实现吗?
@ user1785960:好吧,我不确定SQL是否是合适的接口。但是,如果确实是SQL,而不是HQL,则不需要NHibernate。