2009-07-27 100 views
3

更新需要2NHibernate的:左外連接上子查詢

這裏是兩個查詢我的工作(呼叫在這兩個查詢省略)

我想獲得以下查詢

SELECT * 
FROM product 
LEFT OUTER JOIN 
(
    SELECT * 
    FROM Cart 
    LEFT OUTER JOIN 
    cartproducts 
    ON Cart.Id = cartproducts.Cart_id 
    WHERE Cart.username = 'user' 
) 
AS CartFiltered 
ON product.Id = CartFiltered.product_id 

,但我似乎總是得到

SELECT * 
FROM product 
LEFT OUTER JOIN 
cartproducts 
ON product.Id = cartproducts.Product_id 
LEFT OUTER JOIN 
Cart 
ON 
cartproducts.cart_id = cart.id 
WHERE Cart.username = 'user' 

如何管理創建第一種查詢類型? 我希望我的問題是更清晰:)缺乏明確的是,有時我的一個大敵:對


更新:

FWIW,我還沒有找到答案,我目前加載分頁的產品數據和整個購物車以顯示正確的對象。 原油解決方案,但它的工作原理,它擊敗了我一直試圖讓Criteria API認可我爲其主人的組合。我會非常有興趣,如果有人能發生點我在正確的方向,雖然;)


你好,

我有一個很難的標準API書面下面的查詢,我真的不知道該怎麼做:我希望有人能夠提供幫助。

在數據庫中,我有產品。這些產品可以在許多購物車中(每個用戶一個購物車),並且每個購物車可以包含許多產品,所以我們有許多關係。 我想顯示每個產品的列表以及旁邊的小圖標,以通知用戶此特定產品已在購物車中。我所做的是,我向NHibernate詢問了我的產品,並在由購物車所有者過濾的購物車上執行左外連接。

Dim critPage As ICriteria = Session.CreateCriteria(GetType(Product)) _ 
.SetFirstResult(pageNumber * itemsPerPage).SetMaxResults(itemsPerPage) _ 
.CreateCriteria("Carts", "c", SqlCommand.JoinType.LeftOuterJoin) _ 
.SetProjection(plist) _ 
.SetResultTransformer(New TypedResultTransformer(Of ProductWithCartInfo)) _ 
.Add(Expression.Eq("c.User", username)) 

投影名單是在這裏列的數量減少到什麼是對ProductWithCartInfo類有趣。它只包含屬性預測。

問題是,使用此查詢,購物車過濾應用於整個結果集,並且我看不到每個產品都存在於用戶的購物車中,而是看到用戶購物車中的每個產品。

是否可以使用Nhibernate中的Criteria API在子查詢上執行左外連接?有關信息,如果可能,我希望將其保留在Criteria API中。 謝謝

回答

6

我不知道我entirly跟隨你的問題,但它聽起來非常類似於我有一個問題。我覺得當你用NHibernate嵌套(子)criteira時,你會失去一些控制權。我能夠解決我的問題,但我的表而不是使用嵌套的criteira別名。

可能試着...

criteria.CreateAlias("Cart", "Cart", JoinType.LeftOuterJoin); 

,然後您上車濾光器將是一個OR條件

ICriterion cartCriterion = Restrictions.Eq("Cart.User", username); 
customerCriterion = Restrictions.Or(customerCriterion, Restrictions.IsNull("Cart.User")); 
criteria.Add(customerCriterion); 

讓我知道這是否可以幫助你...如果不是...也許發佈SQL你上面的標準正在產生,它需要改變。

好運

+0

對不起託德,你是對的,也許我不是做足夠的常識;)我編輯我的問題 – samy 2009-07-31 14:03:35