
JPA批量更新多个id的实体对象
在 Spring Data JPA 中,可以使用 @Query
注解和 HQL 或者 SQL 语句来执行自定义的更新操作。如果要根据多个 ID 更新实体对象,可以使用 IN
关键字。
基于HQL的示例
以下是一个示例,假设我们有一个名为 User
的实体类,其中包含 id 和 name 属性。现在我们想要根据多个 ID 更新这些用户的姓名:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Transactional
@Modifying
@Query("UPDATE User u SET u.name = :name WHERE u.id IN (:ids)")
int updateUsersNameByIds(@Param("name") String name, @Param("ids") List<Long> ids);
}
示例中定义的更新方法 updateUsersNameByIds()
,使用 @Query
注解设置更新操作的 HQL 语句,其中 :name
和 :ids
是参数占位符。@Param
注解用于指定参数名称。
在 HQL 语句中,使用使用了 IN
关键字并传入了一个 List<Long>
类型的参数 ids,表示要更新的用户 ID 列表。
最后,使用 @Modifying
和 @Transactional
注解分别标记该方法为更新操作和事务性操作。
使用该方法时,只需要传入要更新的用户姓名和 ID 列表即可:
基于Native方式SQL
将上面的示例改写为native的sql方式,可以在 @Query
注解中设置 nativeQuery=true
属性。
改后的示例:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Transactional
@Modifying
@Query(value = "UPDATE user SET name = :name WHERE id IN (:ids)", nativeQuery = true)
int updateUsersNameByIds(@Param("name") String name, @Param("ids") List<Long> ids);
}
上面的代码中,我们使用了 value 属性指定了 Native SQL 语句,其中 :name
和 :ids
是参数占位符,与 HQL 语句类似。同时设置了 nativeQuery = true
表示该语句是原生的 SQL 语句。
原生的SQL,UPDATE语句对应的是数据库表中的表名user,和字段名name,id;而在HQL中,对应的是实体名User和实体属性name,id。