Java 带集合计数的Spring JPA
我目前正在从事一个项目,其中我给了一个实体Java 带集合计数的Spring JPA,java,spring,jpa,spring-data-jpa,Java,Spring,Jpa,Spring Data Jpa,我目前正在从事一个项目,其中我给了一个实体
,该实体有一个订单
实体的集合,因此客户
和订单
之间有一个单一的关系。假设我想选择客户
集合的一个子集,该集合具有相应数量的订单
实体(在SQL中称为计数
):Spring Data JPA提供的查询方法是否已有默认实现,以避免使用JPQL编写自定义查询,在一个SQL查询中按客户获取订单数量,而不是n+1查询,其中n是客户数量?或者可以在某种临时字段上添加某种注释,例如long orderCount
?如果正确命名存储库接口方法,Spring Data JPA将自动创建适当的SQL计数。例如,下面的两个存储库方法将按客户ID或客户姓氏计算订单数量
public interface OrderRepository extends CrudRepository<Order,Long> {
Long countByCustomerId(Long id);
Long countByCustomerLastName(String lastName);
}
公共接口OrderRepository扩展了Crudepository{
长countByCustomerId(长id);
Long countByCustomerLastName(字符串lastName);
}
请仔细阅读下面链接中的代码以了解完整上下文
感谢您的回答和努力来设置此演示git repo。不幸的是,这不是我想要的答案。为了更好地理解我在您的示例上下文中的意思:您可以实现一个额外的测试用例来获取所有客户以及您想要知道订单数量的每个客户。因此,您在循环中获得了
customerRepository.findAll()
(以customer
作为迭代变量,然后访问例如customer.getOrders().size()
这导致n+1个查询。这就是为什么我在Customer
中讨论了某种临时字段long orderCount
。另一种选择是将Customer.getOrders()
更改为FetchType.LAZY
并调用orderRepository.countByCustomerId()
。现在n+1只是用于订单的计数,没有那么繁重。另一种选择是为customer.getOrders()保留FetchType.EAGER
,并使用特定于Hibernate的注释@Fetch(value=FetchMode.JOIN)
。这将通过左外部联接在一个SQL查询中获取客户和所有订单,完全绕过n+1问题。