2012-04-13 19 views
8

मेरे पास जेपीए मानदंडों के बारे में एक प्रश्न है।जेपीए मानदंड क्वेरी Path.get बाएं शामिल है यह संभव है

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

यहाँ जेपीए प्रदाता द्वारा उत्पादित परिणामी क्वेरी है:

यहाँ मेरी जेपीए मापदंड क्वेरी है

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 

के साथ परिणाम प्राप्त करने के लिए ग्राहक में शामिल हो गए जहां Customers शून्य हैं।
Customer, Product, Facility सभी entites हैं, जबकि InventoryItemSumReport एक मूल्य वस्तु या डीटीओ है।

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

उत्तर

8

मैंने पाया इस प्रकार के रूप में यह काम करता है:

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