我有一个表 cartitems ,其中存储了添加到购物车的商品。它有列:
id(主键),sku,数量,userId,状态,大小和其他列的几个
我还有一个 productAvailability 表,我们在其中存储了库存水平以及我有以下列的位置:
sku,尺寸,数量,BatchId(主键)
产品表与 skA 表和 cartitems 表在 sku 键
现在,对于status = 1和userId = x的每个cartitems,我们需要检查产品的可用性,如果可用,我需要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但它仍然加载了具有所有尺寸的sku的productAvailability表。有没有任何方法可以为每个cartItem获取cartItems和相应的BatchIds?
答案 0 :(得分:1)
在您的示例中,您只是从父类中选择项目,因此您无权访问子关联数据。
您可以使用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));
请注意,您可能需要在Projection字段中添加别名,以便转换正常运行。
答案 1 :(得分:0)
因为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" />
现在..在抛出Criteria之后...你实际上可以..使用getProductAvailability并迭代并获取batchid的。