2016-03-02 167 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_问题。 –