Hibernate加入查询条件并使用两列获取连接表

时间:2011-07-25 03:24:42

标签: hibernate e-commerce hibernate-criteria

我有一个表 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?

2 个答案:

答案 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的。