NHibernate + HQL子查询 - 不存在具有给定标识符的行

时间:2014-07-07 14:21:59

标签: c# .net nhibernate fluent-nhibernate hql

我正在使用NHibernate(版本:3.3.1.4000),我正在尝试执行HQL查询,子查询作为SELECT值。它工作正常,问题是当子查询中没有数据时,我遇到以下错误:

  • “不存在具有给定标识符的行[namespace.Table2#-2147483648]”

代码示例:

IQuery query = session.CreateQuery(@"SELECT tb1, 
        (SELECT tb2 
           FROM Table2 tb2
          WHERE tb2.IdVal = tb1.IdVal
            AND tb2.Id2 = :id2)
    FROM Table1 tb1
   WHERE tb1.Cod = :cod1");

IList<object[]> dataResult = query.SetParameter("id2", "value")
    .SetParameter("cod1", 1).List<object[]>(); // The error is trown in this Line

我想知道如何避免此错误,我只希望子查询在没有数据时返回“null”值。

我会感激任何帮助。 提前谢谢。

3 个答案:

答案 0 :(得分:0)

看起来你要做的就是执行左连接。试试这个而不是使用子查询:

IQuery query = session.CreateQuery(@"
    SELECT tb1, tb2
    FROM Table1 tb1
    LEFT JOIN Table2 tb2 ON tb1.IdVal = tb2.IdVal
    WHERE tb1.Cod = :cod1 AND tb2.Id2 = :id2;
");

IList<object[]> dataResult = query
                            .SetParameter("id2", "value")
                            .SetParameter("cod1", 1)
                            .List<object[]>();

答案 1 :(得分:0)

你可以试试这个:

IQuery query = session.CreateQuery(@"SELECT tb1, 
        (SELECT MAX(tb2)
           FROM Table2 tb2
          WHERE tb2.IdVal = tb1.IdVal
            AND tb2.Id2 = :id2)
    FROM Table1 tb1
   WHERE tb1.Cod = :cod1");

使用MAX应该使它在有一个时返回值,而在没有一个时返回NULL。

答案 2 :(得分:0)

你可以试试这个:

 IList<object[]> dataResult = query.SetParameter("id2", "value")   
     .SetParameter("cod1", 1)    
     .List<object[]>()
     .NotFound   
     .Ignore();

看看这个答案:Fluent nHibernate: No row with the given identifier exists. Error occurs when 2 users delete some item