2014-09-23 15 views
1

我得到這個奇怪的錯誤Antlr.Runtime.MismatchedTokenException當運行我的更新查詢對MS SQL服務器。我正在有效地嘗試從另一個表的總和查詢結果中更新表。我試圖在SQL控制檯執行sql directy,它沒有任何問題。當更新表NHibernate Antlr.Runtime.MismatchedTokenException

var sql = new StringBuilder(); 

    sql.Append("UPDATE s SET s.pokriveno = l.pokriveno,"); 
    sql.Append("s.zatvoreno = CASE WHEN s.Pokriveno = s.Duguje + s.Potrazuje THEN 1 ELSE 0 END "); 
    sql.Append("FROM Stavka s "); 
    sql.Append("LEFT JOIN "); 
    sql.Append("("); 
    sql.Append(" SELECT id, SUM(pokriveno) pokriveno FROM "); 
    sql.Append(" ("); 
    sql.Append("  SELECT l.Stavka1Id id, SUM(l.iznos1) pokriveno "); 
    sql.Append("  FROM Link l "); 
    sql.Append("  JOIN stavka s ON l.Stavka1Id = s.Id "); 
    sql.Append("  JOIN Dokument d ON s.DokumentId = d.id "); 
    sql.Append("  WHERE d.godina = :year "); 
    sql.Append("  GROUP BY Stavka1Id "); 
    sql.Append("  UNION ALL "); 
    sql.Append("  SELECT l.Stavka2Id id, SUM(l.iznos2) pokriveno "); 
    sql.Append("  FROM Link l "); 
    sql.Append("  JOIN stavka s ON l.Stavka2Id = s.Id "); 
    sql.Append("  JOIN Dokument d ON s.DokumentId = d.id "); 
    sql.Append("  WHERE d.godina = :year "); 
    sql.Append("  GROUP BY Stavka2Id "); 
    sql.Append(" ) tmp GROUP BY id "); 
    sql.Append(") l "); 
    sql.Append("ON s.Id = l.id"); 

    Debug.WriteLine(sql); 
    var query = session.CreateQuery(sql.ToString()); 
    query.SetParameter("year", year); 
    int count = query.ExecuteUpdate(); 

任何人都知道發生了什麼?

回答

2

這裏的問題是,您正在使用API​​來處理HQL/DML查詢,同時傳遞本地SQL語句。請參閱:

取而代之的.CreateQuery(hql) HQL期待,我們必須使用.CreateSQLQuery(sql)期待本地SQL傳遞

var query = session 
    //.CreateQuery(sql.ToString()) 
    .CreateSQLQuery(sql.ToString()) 
    ; 
query.SetParameter("year", year); 
int count = query.ExecuteUpdate(); 

也看到了CreateQuery用法:

+0

呀,想通已經通過了絆腳石到另一個帖子裏面說HQL不支持連接查詢和子查詢只允許(雖然我已經看到了樣本與JOIN語句)。無論哪種方式,應用您的代碼完美的作品。 – zszep 2014-09-23 11:52:00