【问题标题】:JPA Criteria query Path.get left join is it possibleJPA Criteria查询Path.get left join是否可能
【发布时间】:2012-04-13 16:56:28
【问题描述】:

我有一个关于 JPA 标准的问题。

这是我的 JPA 条件查询:

 CriteriaBuilder criteriaBuilder = getEm().getCriteriaBuilder();
 CriteriaQuery<InventoryItemSumReport> query = criteriaBuilder.createQuery(InventoryItemSumReport.class);
 Root<InventoryItemDetail> from = query.from(InventoryItemDetail.class);    

 Join<InventoryItemDetail, InventoryItem> joinItem = from.join(InventoryItemDetail_.inventoryItem); 

 Predicate where = criteriaBuilder.lessThanOrEqualTo(from.get(InventoryItemDetail_.effectiveDate), date);

 query.multiselect(joinItem.get(InventoryItem_.product),joinItem.get(InventoryItem_.facility),joinItem.get(InventoryItem_.customer));
 query.groupBy(joinItem.get(InventoryItem_.product),joinItem.get(InventoryItem_.facility),joinItem.get(InventoryItem_.customer));
 query.where(where); 

 TypedQuery<InventoryItemSumReport> createQuery = getEm().createQuery(query);       
 List<InventoryItemSumReport> resultList = createQuery.getResultList();

以下是 JPA 提供者生成的查询结果:

    select
        inventoryi1_.PRODUCT_ID as col_0_0_,
        inventoryi1_.FACILITY_ID as col_1_0_,
        inventoryi1_.CUSTOMER_ID as col_2_0_ 
    from
        INVENTORY_ITEM_DETAIL inventoryi0_ 
    inner join
        INVENTORY_ITEM inventoryi1_ 
            on inventoryi0_.INVENTORY_ITEM_ID=inventoryi1_.ID 
    inner join
        PRODUCT product2_ 
            on inventoryi1_.PRODUCT_ID=product2_.ID 
    inner join
        FACILITY facility3_ 
            on inventoryi1_.FACILITY_ID=facility3_.ID 
    inner join
        CUSTOMER customer4_ 
            on inventoryi1_.CUSTOMER_ID=customer4_.ID 
    where
        inventoryi0_.EFFECTIVE_DATE<= ? 
    group by
        inventoryi1_.PRODUCT_ID ,
        inventoryi1_.FACILITY_ID ,
        inventoryi1_.CUSTOMER_ID

但我想要以下查询:

    select
        inventoryi1_.PRODUCT_ID as col_0_0_,
        inventoryi1_.FACILITY_ID as col_1_0_,
        inventoryi1_.CUSTOMER_ID as col_2_0_ 
    from
        INVENTORY_ITEM_DETAIL inventoryi0_ 
    inner join
        INVENTORY_ITEM inventoryi1_ 
            on inventoryi0_.INVENTORY_ITEM_ID=inventoryi1_.ID 
    inner join
        PRODUCT product2_ 
            on inventoryi1_.PRODUCT_ID=product2_.ID 
    inner join
        FACILITY facility3_ 
            on inventoryi1_.FACILITY_ID=facility3_.ID 
    left join
        CUSTOMER customer4_ 
            on inventoryi1_.CUSTOMER_ID=customer4_.ID 
    where
        inventoryi0_.EFFECTIVE_DATE<= ?
    group by
        inventoryi1_.PRODUCT_ID ,
        inventoryi1_.FACILITY_ID ,
        inventoryi1_.CUSTOMER_ID

使用 left join CUSTOMER 也可以获得 Customers 为空的结果。
CustomerProductFacility 都是实体,而 InventoryItemSumReport 是值对象或 DTO。

public class InventoryItemSumReport implements Serializable {

   private static final long serialVersionUID = 1L;

   private Product product;
   private Facility facility;
   private Customer customer;

   public InventoryItemSumReport(Product product, Facility facility, Customer customer) {
       super();
       this.product = product;
       this.facility = facility;
       this.customer = customer;
   }
}

【问题讨论】:

    标签: jpa-2.0 java-ee-6 criteria-api


    【解决方案1】:

    我发现它的工作原理如下:

     CriteriaBuilder criteriaBuilder = getEm().getCriteriaBuilder();
     CriteriaQuery<InventoryItemSumReport> query = criteriaBuilder.createQuery(InventoryItemSumReport.class);
     Root<InventoryItemDetail> from = query.from(InventoryItemDetail.class);    
    
     Join<InventoryItemDetail, InventoryItem> joinItem = from.join(InventoryItemDetail_.inventoryItem); 
    
     Predicate where = criteriaBuilder.lessThanOrEqualTo(from.get(InventoryItemDetail_.effectiveDate), date);
    
     Join<InventoryItem, Customer> joinCustomer = joinItem.join(InventoryItem_.customer, JoinType.LEFT);
     query.multiselect(joinItem.get(InventoryItem_.product),joinItem.get(InventoryItem_.facility),joinItem.get(InventoryItem_.customer));
     query.groupBy(joinItem.get(InventoryItem_.product),joinItem.get(InventoryItem_.facility),joinCustomer);
     query.where(where); 
    
     TypedQuery<InventoryItemSumReport> createQuery = getEm().createQuery(query);       
     List<InventoryItemSumReport> resultList = createQuery.getResultList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 2011-06-12
      • 2012-04-29
      相关资源
      最近更新 更多