2016-03-02 130 views
2

我目前的工作在哪裏我已經給它具有Order實體的集合,CustomerOrder之間,因此一個一對多關係的實體Customer的項目。假設我想選擇具有相應數量的Order實體(在SQL中稱爲COUNT)的集合的子集:Spring Data JPA提供的查詢方法是否已經存在缺省實現以避免用JPQL寫一個自定義查詢,在一個SQL查詢中獲取客戶的訂單數量而不是n + 1查詢其中n是客戶數量?或者某種註釋可以在Customer中添加某種瞬態字段,例如long orderCount春天JPA與集合數

回答

2

如果您正確命名存儲庫接口方法,Spring Data JPA將自動創建相應的COUNT SQL。作爲一個例子,這兩個倉庫的方法下面將通過客戶ID或客戶的姓氏統計的訂單數量

public interface OrderRepository extends CrudRepository<Order,Long> { 
    Long countByCustomerId(Long id); 
    Long countByCustomerLastName(String lastName); 
} 

請仔細閱讀該代碼在下面的鏈接完整的上下文

https://github.com/juttayaya/stackoverflow/tree/master/CustomerOrder

+0

感謝你的答案和努力來設置這個演示git回購。不幸的是,這不是我正在尋找的答案。爲了更好地瞭解您的示例中的含義:您可以實施額外的測試用例,以獲取所有客戶以及您想要了解訂單數量的每位客戶。因此,您已經在一個循環中使用了'customerRepository.findAll()'(將'customer'作爲迭代變量,然後您可以訪問例如'customer.getOrders()。size()',這會導致_n + 1_查詢。我在**'Customer' **中討論了某種瞬態字段'long orderCount' – Tom

+0

另一種方法是將'customer.getOrders()'改爲'FetchType.LAZY'並調用'orderRepository.countByCustomerId()'。 _n + 1_僅用於訂單的COUNT,這不是太繁瑣 –

+1

另一種方法是爲'customer.getOrders()'保留'FetchType.EAGER'並使用特定於Hibernate的註解@Fetch( value = FetchMode.JOIN)'這將通過LEFT OUTER JOIN在一個SQL查詢中獲得一個客戶和所有訂單,完全繞過_n + 1_問題。 –