hibernate結合クエリ基準と両方の列で結合テーブルを取得する
-
25-10-2019 - |
質問
テーブルがあります 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を取得します。