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。

 

 

版权声明:著作权归作者所有。

thumb_up 0 | star_outline 0 | textsms 0