Spring JPA与集合计数

3
我目前正在从事一个项目,其中我已经定义了一个实体Customer,它具有Order实体的集合,因此在CustomerOrder之间存在一对多关系。假设我想选择一个Customer集合的子集,并获取相应的Order实体数量(在SQL中称为COUNT),Spring Data JPA提供的查询方法是否已经有默认实现可以避免编写自定义JPQL查询获取每个客户的订单数量而只需要使用一个SQL查询呢?或者是否有一种注解可以添加在Customer上的一些临时字段,例如long orderCount
1个回答

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

1
感谢您的回答和努力设置此演示git存储库。不幸的是,这不是我要找的答案。为了更好地理解我在您的示例上的意思:您可以实现一个附加的测试用例来获取所有客户,并且对于每个客户,您想知道订单数量。因此,您在循环中使用customerRepository.findAll()(使用customer作为迭代变量),然后访问例如customer.getOrders().size(),这会导致_n+1_查询。这就是为什么我谈论一些类似于**Customer**中的瞬态字段long orderCount的原因。 - Tom
有一个替代方案是将customer.getOrders()更改为FetchType.LAZY,然后调用orderRepository.countByCustomerId()。现在_n+1_仅适用于订单数量的计数,这并不那么繁重。 - Jirawat Uttayaya
2
另一种选择是保持customer.getOrders()FetchType.EAGER,并使用Hibernate特定的注释@Fetch(value = FetchMode.JOIN)。这将通过LEFT OUTER JOIN在一个SQL查询中获取客户和所有订单,完全绕过_n+1_问题。 - Jirawat Uttayaya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接