4

更新テイク2

これが私が扱っている2つのクエリです(両方のクエリでページングは​​省略されています)

次のクエリを取得したい

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'

どうすれば最初のタイプのクエリを作成できますか?私の質問がより明確になることを願っています:)明確さの欠如は時々私の大きな敵です:p


アップデート:

FWIW、まだ答えが見つかりません。現在、ページングされた商品データとカート全体を読み込んで、正しいオブジェクトを表示しています。粗雑な解決策ですが、それは機能し、CriteriaAPIに私をマスターとして認識させるために私が経験した組み合わせを打ち負かします。誰かが私を正しい方向に向けることができたら、私は非常に興味があります;)


こんにちは、

Criteria APIで次のクエリを作成するのに苦労していますが、その方法がよくわかりません。一部の人が助けてくれることを願っています。

データベースには、製品があります。これらの製品は多くのカート(ユーザーごとに1つのカート)に入れることができ、各カートには多くの製品を含めることができるため、多対多の関係があります。すべての商品のリストとその横にある小さなアイコンを表示して、この特定の商品がすでにカートに入っていることをユーザーに知らせたいと思います。私がしたことは、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のCriteriaAPIを使用して、サブクエリで左外部結合を実行することは可能ですか?参考までに、可能であればCriteriaAPIに保持したいと思います。ありがとう

4

1 に答える 1

6

私があなたの問題を完全にフォローしているのかどうかはわかりませんが、私が抱えていた問題と非常によく似ています。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とそれを変更する必要がある場所を投稿してください。

幸運を

于 2009-07-31T12:23:16.267 に答える