2014-07-07 97 views
0

我正在使用NHibernate(版本:3.3.1.4000),我試圖執行一個HQL查詢,作爲一個SELECT值的子查詢。它工作正常,問題是當在子查詢中沒有數據,那麼我有以下錯誤:NHibernate + HQL子查詢 - 沒有給定標識符的行

  • 「與給定的標識符的行存在[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 

我想知道我怎樣才能避免這種錯誤,我只是想子查詢返回一個「空」值當沒有數據。

我將不勝感激任何幫助。 在此先感謝。

+0

這是否提問/回答幫你呢? http://stackoverflow.com/q/695931/497356 –

+0

HI @AndrewWhitaker,謝謝,但不幸的是,我已經找到了stackoverflow,並找不到答案。 – Jacobi

+0

你到底將參數值傳遞給了什麼?代碼看起來有點奇怪 - 什麼是id2 for ...另一個實體? – cbp

回答

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[]>(); 
+0

嗨@Hamilton,不幸的是NHibernate不允許這樣做,因爲要使用JOIN,他希望它被映射。謝謝。 – Jacobi

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"); 

個e-使用MAX應該讓它返回值時,有一個和NULL當有ISN」一個。

+0

Hi @JoãoMendes,我不能在表中使用MAX,它必須用在一個字段中。子查詢將始終返回1或沒有任何內容。不幸的是,在「無」它拋出一個例外。 – Jacobi

+0

然後我不知道你想要什麼可能沒有映射表2 ... –