1

我有一个表caritems存储添加到购物车的项目。它有列:

id(主键)、sku、数量、userId、状态、大小和其他几列

我还有一个productAvailability表,我们在其中存储 Inventory 级别,并且我有以下列:

sku、大小、数量、BatchId(主键)

产品表也与sku键上的productAvailability表和caritems表具有一对多关系

现在,对于 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 表。是否有任何方法可以同时获取每个 cartItems 的 cartItems 和相应的 BatchIds?

4

2 回答 2

1

在您的示例中,您仅从父类中选择项目,因此您无权访问子关联数据是有道理的。

您可以使用Projections来选择您想要(或真正需要)的那些字段,然后使用 aResultTransformer来加载 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 字段添加别名,以便转换正常工作。

于 2011-07-25T13:33:36.143 回答
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" />

现在..在超越标准之后......你实际上可以..使用getProductAvailability并迭代并获取批处理ID。

于 2011-07-25T06:46:44.870 回答