Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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
Spring boot SpringData JPA:以实体集合为参数的查询_Spring Boot_Jpa_Spring Data Jpa_Spring Data - Fatal编程技术网

Spring boot SpringData JPA:以实体集合为参数的查询

Spring boot SpringData JPA:以实体集合为参数的查询,spring-boot,jpa,spring-data-jpa,spring-data,Spring Boot,Jpa,Spring Data Jpa,Spring Data,我有一个要对其执行更新的实体列表,我知道我可以使用字符串/整数列表更新表。。etc作为参数 @Query("update tableName i set i.isUpdated = true where i.id in :ids") void markAsUpdated(@Param("ids") List<Integer> itemIds); 查询需要ID,它不知道如何处理实体 您有多种选择: 只需将ID传递给方法,客户机负责提

我有一个要对其执行更新的实体列表,我知道我可以使用字符串/整数列表更新表。。etc作为参数

  @Query("update tableName i set i.isUpdated = true where i.id in :ids")
  void markAsUpdated(@Param("ids") List<Integer> itemIds);


查询需要ID,它不知道如何处理实体

您有多种选择:

  • 只需将ID传递给方法,客户机负责提取ID
  • 传递实体并使用SpEL提取ID
  • 正如注释中所建议的,使用默认方法提供两个API,并从一个API委托给另一个API
至于评论中提出的问题:您可以通过以下方式将提取id的方法移动到单个方法中:或者让相关实体实现类似于此的接口:

interface WithId {
    Long getId();
}
或者通过向方法传递lambda,对单个实体进行转换:

List<ID> extractIds(List<E> entities, Function<E, ID> extractor) {
    // ...
}
列表提取器ID(列表实体、函数提取器){
// ...
}

我认为这是不可能的,如果你看一下
SimpleParepository.deleteInBatch的实现,你会意识到将实体转换为ID列表是两个坏处中较小的一个。另外,如果说“重复转换”,你的意思是必须在代码周围的多个位置进行转换,注意,您可以简单地将第二个方法实现为默认方法,并将其委托给第一个方法one@crizzis谢谢,重复转换我的意思是对于具有类似查询的不同实体,我需要重复转换,我不能将不同实体转换委托给同一个方法,对吗?至少不使用一些黑客。我想我会坚持使用身份证。
List<ID> extractIds(List<E> entities, Function<E, ID> extractor) {
    // ...
}