2011-07-25 31 views
0

我有一個表cartitems其中的項目添加到購物車都存儲在它的列:休眠加入查詢條件得到加入表都列

ID(主鍵),SKU數量,用戶id,狀態,大小和其他幾個欄目

我也有我們在其中存儲庫存水平和productAvailability表在那裏我有以下欄目:

SKU,規格,數量,BatchId(主Key)

另外產品表具有一到許多與productAvailability關係表和cartitems表既對SKU鍵現在

,用於與狀態,爲每個cartitems = 1和用戶id = X我們要檢查產品的可用性和如果有的話,我需要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?

回答

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)); 

請注意,您可能需要添加別名投影領域,使改造正常工作。

0

因爲CartItem Table和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的。

+0

我想避免迭代。但看起來沒有其他選擇而不是迭代 –