【问题标题】:NHibernate returning wrong results of SQL queryNHibernate 返回错误的 SQL 查询结果
【发布时间】:2012-03-29 06:32:12
【问题描述】:

我有一个包含在 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 中获取结果集

有人有什么想法吗?

【问题讨论】:

    标签: oracle nhibernate


    【解决方案1】:

    我报告了exactly this as a bug,但这不是错误。 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 看来,这似乎很弱,返回的结果与数据库在面对完全相同的查询时返回的结果不同。我什至不介意一个错误,但悄悄地返回错误的结果真的很糟糕。这根本不是必要的限制。 :/ 仔细想想,这显然是一个错误。
    • 这也是我的看法。如果需要,您可以在 jira 中添加一些评论。添加一个“功能增强”类型的新问题可能会更好。在 jira 中保持礼貌,有些人在那里很敏感......
    • +1 用于报告错误 ID,这使我得出结论,这个错误对于 nhibernate 来说“不是错误”,我应该在查询中使用相同的拼写重命名列名。
    • 如何忍受这个“不是虫子”?我的情况是用户输入 sql 并且他想要正确的结果。我应该跳过使用 nhibernate 还是更好的东西?现在有办法覆盖这个实现吗?
    • @user1785960:好吧,我不确定 SQL 是否是一个合适的接口。但是,如果真的是 SQL,而不是 HQL,则不需要 NHibernate。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多