如何在 Spring Data JPA 中为自定义 @Query 提供和使用 varargs 或 Iterable 参数?

l00*_*0tr 4 java spring-data-jpa

我使用 Spring Data JPA(当前为 1.11.3.RELEASE)和 Hibernate(当前为 5.2.10.Final)作为 JPA 实现

我有以下场景作为(简化的)示例,首先是一个简单的 User 实体类:

@Entity
public class User {

@Id
private Long id;

private boolean active;

// getters/setters (not shown)

}
Run Code Online (Sandbox Code Playgroud)

具有基于 CRUD 的用户存储库。这个用户存储库应该提供方法来停用由其 id 标识的用户:

public interface UserRepository extends CrudRepository<User, Long> {

// deactivate single user
@Modifying
@Query("UPDATE User u SET active = false WHERE u.id = ?1")
void deactivate(Long id);

// TODO how to provide a deactivateAll method
}
Run Code Online (Sandbox Code Playgroud)

Spring Data JPA 文档中使用@Query 的修改形式很好地描述了该解决方案。

我在文档中错过的是如何提供 ids 列表作为 varags 或 Iterable 参数允许同时停用多个用户我怎样才能做到这一点?

l00*_*0tr 6

Spring Data JPA 源代码存储库中有一个类似的用户存储库示例:UserRepository.java,例如使用 @Query,如下所示:

@Query("select u from User u where u.id in :ids")
Collection<User> findByIdsCustomWithNamedVarArgs(@Param("ids") Integer... ids);
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用 varargs 或 Iterable<> 提供 id 列表,如下所示(在本例中使用命名参数变体):

@Modifying
@Query("UPDATE User u SET active = false WHERE u.id IN :ids")
void deactivateAll(@Param("ids") Long... ids);

@Modifying
@Query("UPDATE User u SET active = false WHERE u.id IN :ids")
void deactivateAll(@Param("ids") Iterable<Long> ids);
Run Code Online (Sandbox Code Playgroud)