Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带集合计数的Spring JPA_Java_Spring_Jpa_Spring Data Jpa - Fatal编程技术网

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问题。