質問

テーブルがあります cartitems カートに追加されたアイテムが保管されている場所。列があります。

ID(プライマリキー)、SKU、数量、ユーザーID、ステータス、サイズ、その他の列のいくつか

私も持っています ProductAvailability 在庫レベルを保存し、次の列があるテーブル:

SKU、サイズ、数量、batchid(プライマリキー)

また 製品 テーブルには、1対多くの関係があります ProductAvailability テーブルと cartitems 両方のテーブル Sku

これで、ステータス= 1およびuserId = xの各cartitemsについて、製品の可用性を確認する必要があります。利用可能な場合は、製品のcartitems rowと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を使用してみましたが、SKUのすべてのサイズのProductAvailabilityテーブルがまだロードされています。各cartitemsに対応するバッチドの両方を取得する方法はありますか?

役に立ちましたか?

解決

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

使用できます Projections 必要なフィールドを選択する(または実際、必要な)、次に使用します 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));

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

他のヒント

CartitemテーブルとProductAvailabilityテーブルの間に多くの関係があるためです。カートアイテムモデルにセットまたはリストまたはバッグを持っているでしょう。そして、マッピングは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を取得します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top