1

カートに追加されたアイテムが格納されるテーブルcaritemsがあります。列があります。

id (主キー)、sku、数量、userId、ステータス、サイズ、その他の列

在庫レベルを格納するproductAvailabilityテーブルもあり、次の列があります。

sku、サイズ、数量、BatchId (主キー)

また、製品テーブルには、 skuキーの両方で、productAvailabilityテーブルおよびcaritemsテーブルと 1 対多の関係があります。

ここで、status = 1 および userId=x の各カートアイテムについて、商品の在庫状況を確認する必要があります。在庫がある場合は、商品の 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();

上記は基本的に次のことを行います。

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

この方法では、BatchId を取得できません。JOIN FETCHTYPE を使用してみましたが、引き続き productAvailability テーブルにすべてのサイズの SKU が読み込まれます。各cartItemsのcartItemsと対応するBatchIdsの両方を取得する方法はありますか?

4

2 に答える 2

1

あなたの例では、親クラスからアイテムを選択しているだけなので、子の関連付けデータにアクセスできないのは理にかなっています。

を使用Projectionsして、必要な (または実際に必要な) フィールドを選択し、 a を使用ResultTransformerして JavaBean をロードできます。あなたの場合、CartItemsクラスをフィールドで拡張して を保持し、次をクエリBatchIdに追加します。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));

変換が適切に機能するように、射影フィールドにエイリアスを追加する必要がある場合があることに注意してください。

于 2011-07-25T13:33:36.143 に答える
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を使用して、バッチIDを繰り返し取得することができます。

于 2011-07-25T06:46:44.870 に答える