2011-07-15 60 views
0

我有以下方法。其中返回「無法執行更新查詢」。如果我查詢另一個實體屬性,即「Order.Campaign.Id」,我是否需要包含連接?這將如何工作。 ?如何使用nhibernate刪除使用哪裏與連接

public void RemoveOrderItems(int companyId, int campaignId, int productId, int orderStatus) 
{ 
    using (ITransaction transaction = _session.BeginTransaction()) 
    { 
     _session.CreateQuery("delete from OrderItem where Product.Id = '" + productId + "' and Order.Company.Id = '" + companyId + "' and Order.Campaign.Id = '" + campaignId + "' and Order.OrderStatus = '" + orderStatus + "'").ExecuteUpdate(); 
     transaction.Commit(); 
    } 
} 

**編輯**

這裏是SQL語句。

DELETE oi 
FROM OrderItems oi inner JOIN Orders o On oi.OrderId = o.Id 
Where oi.ProductId = '13077' and o.CompanyId = '32' and o.CampaignId = '2' and o.OrderStatus = 3 
+0

看看我的樣品,應該很容易。用參數(:myparam和SetParameter)替換'13077','32','2' –

回答

3
_session.CreateQuery(@" 
    delete OrderItem oi 
    where oi in 
     (select i 
      from OrderItem i 
      where i.Product.Id = :productId 
      and i.Order.Company.Id = :companyId 
      and i.Order.Campaign.Id :campaignId 
      and i.Order.OrderStatus = :orderStatus) 
    ") 
    .SetParameter("productId", productId) 
    .SetParameter("companyId", companyId) 
    .SetParameter("campaignId", campaignId) 
    .SetParameter("orderStatus", orderStatus) 
    .ExecuteUpdate(); 

生成的SQL不是完全是與您手動創建的相同,但在語義上相同。

1

sql語句無效,您的where語句不正確。嘗試在Microsoft SQL Server Management Studio中編寫查詢,然後用您的參數將其重寫爲CreateQuery。

1

查找SQL Server Management Studio中的權利查詢,這樣做我的樣品後(查詢可以更難治當然用的加盟,子查詢)

ISession session = SessionFactory.GetCurrentSession(); 
using (var tx = session.BeginTransaction()) 
{ 
    try 
    { 
     IQuery myQuery = session.CreateQuery("DELETE FROM TableA c WHERE c.Field1 = :Filed1Value and c.Field2 = :Field2 ") 
      .SetParameter("Field1", 25) 
      .SetParameter("Field2", "Test") 
     myQuery.ExecuteUpdate(); 
     tx.Commit(); 
    } 
    catch (Exception) 
    { 
     tx.Rollback(); 
    } 
}