Ścieżka zapytania JPA Kryteria.get lewe przyłączenie jest możliwe
Mam pytanie dotyczące kryteriów JPA.
Oto moje zapytanie o kryteria JPA:
<code> 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(); </code>
Oto wynikowe zapytanie wygenerowane przez dostawcę JPA:
<code> 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 </code>
Ale chciałbym następujące zapytanie:
<code> 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 </code>
zw lewo dołącz do KLIENTA aby uzyskać również wyniki gdzieCustomers
są puste.Customer
, Product
, Facility
wszyscy są entites, podczas gdyInventoryItemSumReport
jest obiektem Value lub DTO.
<code>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; } } </code>