我目前正在从事一个项目,其中我已经定义了一个实体
Customer
,它具有Order
实体的集合,因此在Customer
和Order
之间存在一对多关系。假设我想选择一个Customer
集合的子集,并获取相应的Order
实体数量(在SQL中称为COUNT
),Spring Data JPA提供的查询方法是否已经有默认实现可以避免编写自定义JPQL查询获取每个客户的订单数量而只需要使用一个SQL查询呢?或者是否有一种注解可以添加在Customer
上的一些临时字段,例如long orderCount
?
customerRepository.findAll()
(使用customer
作为迭代变量),然后访问例如customer.getOrders().size()
,这会导致_n+1_查询。这就是为什么我谈论一些类似于**Customer
**中的瞬态字段long orderCount
的原因。 - Tomcustomer.getOrders()
更改为FetchType.LAZY
,然后调用orderRepository.countByCustomerId()
。现在_n+1_仅适用于订单数量的计数,这并不那么繁重。 - Jirawat Uttayayacustomer.getOrders()
的FetchType.EAGER
,并使用Hibernate特定的注释@Fetch(value = FetchMode.JOIN)
。这将通过LEFT OUTER JOIN在一个SQL查询中获取客户和所有订单,完全绕过_n+1_问题。 - Jirawat Uttayaya