2012-04-13 36 views
8

Tôi có câu hỏi về tiêu chí JPA.Truy vấn Tiêu chí JPA Đường dẫn tham gia Path.get là có thể

Đây là tiêu chí JPA tôi truy vấn:

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

Dưới đây là kết quả truy vấn được sản xuất bởi nhà cung cấp 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 

Nhưng tôi muốn các truy vấn sau đây:

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 

với còn lại tham gia CUSTOMER để nhận kết quả trong đó Customers không có giá trị.
Customer, Product, Facility là tất cả các quyền, trong khi InventoryItemSumReport là đối tượng Giá trị hoặc 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; 
    } 
} 

Trả lời

8

tôi thấy như sau hoạt động:

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(); 
Các vấn đề liên quan