2011-07-25 9 views
0

私はアイテムがカートに追加さcartitemsが中に保存されているテーブルがあるとの結合テーブルを取得してそれは列があります。Hibernateはクエリ条件に参加して、両方の列

ID(主キー)、SKUを、プライマリ

SKU、サイズ、数量、BatchId(:数量は、ユーザーID、状態、サイズ、および他の列

のカップルは は

私も、どこで、次の列があり、我々は在庫レベルを格納しているproductAvailabilityテーブルを持っていますキー)

また製品テーブルステータス= 1、そのユーザーID = Xを有する各cartitemsためproductAvailabilityテーブルとすぐキー

SKUにcartitemsテーブルの両方と1対多の関係を有します我々は、製品の可用性を確認する必要があり、利用可能な場合、私はCartItems行と製品のBatchIdが必要になります。

私はここまでだ:

Criteria criteria = session.createCriteria(CartItems.class,"cartitems"); 
      criteria.add(Restrictions.eq("userId", userId)); 
      criteria.add(Restrictions.eq("status", status)); 
      criteria.createAlias("product", "product"); 
      criteria.createAlias("product.productAvailability", "productavailability"); 
      criteria.add(Restrictions.eqProperty("productavailability.size", "cartitems.size")); 
      criteria.add(Restrictions.geProperty("productavailability.quantity", "cartitems.quantity")); 
        List<CartItems> cartItems = criteria.list(); 

上記は、基本的には次のん:私はBatchIdを取得することはできません

select * from cartItems 
    where productAvailability.quantity >= cartitems.quantity and 
      productAvailability.size = cartitems.size and 
      productAvailability.sku = cartitems.sku and 
      cartitems.userId = ? and 
      cartitems.status = ? 

この方法です。私はJOIN FETCHTYPEを使用しようとしましたが、それでもskuのすべてのサイズのproductAvailabilityテーブルがロードされます。 cartItemsごとにcartItemsと対応するBatchIdの両方を取得する方法はありますか?

答えて

1

あなたの例では、親クラスから項目を選択するだけなので、子関連データへのアクセス権がないことが理にかなっています。

Projectionsを使用して、必要なフィールドを選択し、ResultTransformerを使用してJavaBeanをロードすることができます。あなたのケースでは、私はBatchIdを保持するフィールドであなたのCartItemsクラスを拡張だろうし、お使いCriteriaクエリに次の行を追加します。あなたはその変換して投影フィールドにエイリアスを追加する必要があるかもしれません

ProjectionList projections = Projections.projectionList(); 
projections.add(Projections.property("sku")); 
projections.add(Projections.property("quantity")); 
...etc... 
projections.add(Projections.property("productavailability.BatchId", "BatchId")); 
criteria.setProjection(projections); 
criteria.setResultTransformer(Transformers.aliasToBean(CartItemsTO.class)); 

注意適切に動作します。

0

CartItemテーブルとproductAvailabilityテーブルの間に1対多の関係があるためです。あなたは、カートアイテムモデルにセット、リスト、バッグを持っています。マッピングはhbmのようなものになります。

<set name="productAvailabilitySet" table="table_product_availability" 
     inverse="true" fetch="select" cascade="save-update" lazy="false"> 
     <key column="table_availability2cart_item" /> 
     <one-to-many 
    class="com.example.ProductAvailability" /> 

は今...上記の基準を投げた後...あなたは実際に... getProductAvailabilityを使用して反復処理し、batchid年代を得ることができます。

+0

私は反復を避けたいと思っていました。しかし、反復以外のオプションはないようです –

関連する問題