如何处理Spring Data JPA中的一系列ID批量删除?

时间:2016-04-21 08:03:50

标签: hibernate spring-mvc spring-data spring-data-jpa

现在我有一个用户类,我从arrayjsp获得html的请求数据。

列出此Integer[] arr=[5,6,9,10,62,52,21]

然后我使用两种方法来完成批量删除操作。

@Transactional
@Override
public void deleteUser(Integer id) {

    oneRepository.delete(id);
}


@Transactional
@Override
public void deleteSomeUser(Integer[] ids) {

    for (Integer id : ids) {

        deleteUser(id);

    }

}

我想知道,如果这是一种更有效的方法来完成此操作。

你可以看到我的日志: 看起来不太好!

[94, 95, 91, 92, 93]
Hibernate: 
    delete 
    from
        sshh_user 
    where
        ID=?


Hibernate: 
    delete 
    from
        sshh_user 
    where
        ID=?



Hibernate: 
    delete 
    from
        sshh_user 
    where
        ID=?



Hibernate: 
    delete 
    from
        sshh_user 
    where
        ID=?



Hibernate: 
    delete 
    from
        sshh_user 
    where
        ID=?



Hibernate: 
    select
        count(practice0_.ID) as col_0_0_ 
    from
        sshh_user practice0_

7 个答案:

答案 0 :(得分:19)

只需将以下内容添加到您的用户存储库界面

即可
void deleteByIdIn(List<Integer> ids);

Spring将通过方法名称派生自动生成相应的查询。

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods

编辑:关于此

的详细信息

使用像CrudRepository这样的Springs Repository接口,JpaRespository带来了基本的数据库操作集,如创建,读取,更新,删除,分页,排序等。

要手动添加一些简单的查询,例如搜索用户名或邮件地址,弹簧提供了良好的机制,而没有注释任何基于字符串的HQL查询或类似信息。

Spring只会分析您的方法名称,搜索关键字。阅读上面提供关键字的文档链接。

CrudRepository<User>的示例方法:

Iterable<User> findByNameLike(String search)解析为select * from user where name like '<search>'

void deleteByIdIn(List<Integer> ids)解析为delete from user where id in ([ids])

答案 1 :(得分:11)

假设你有一个UserRepository

public interface UserRepository extends JpaRepository<User, Integer> {}

然后,您可以在UserRepository

中添加如下所示的修改查询方法
/**
 * Delete all user with ids specified in {@code ids} parameter
 * 
 * @param ids List of user ids
 */
@Modifying
@Query("delete from User u where u.id in ?1")
void deleteUsersWithIds(List<Integer> ids);

最后,您可以更改批量删除服务,如下所示:

@Transactional
@Override
public void deleteSomeUser(Integer[] ids) {
    oneRepository.deleteUsersWithIds(Arrays.asList(ids));
}

这将生成一个删除查询,如:

Hibernate: delete from users where id in (? , ? , ?)

当您从另一个方法调用一个public建议方法时,也要注意Self Invocation个问题。

答案 2 :(得分:1)

如果您的存储库接口扩展了CrudRepository,则可以简单地使用deleteAll(List 实体)。不需要此类查询。

  1. 使用findAllById(ids)

  2. 获取列表<用户>
  3. deleteAll(List <用户>实体)

答案 3 :(得分:0)

我们使用HQL来执行此类删除。您可以在此处看到http://www.java2s.com/Tutorial/Java/0350__Hibernate/HSQLDeleteWithParameter.htm 并且可以在查询中使用。

答案 4 :(得分:0)

感谢rayrayj92解决方案。您无需编写任何自定义查询,只需获取一个对象列表,然后删除该列表中的所有对象即可。

@DeleteMapping("/deleteproduct")
public ResponseEntity<?> deleteProduct(@Valid @RequestBody Map<String,Object> userMap){

    List<String> idList=(List<String>) userMap.get("id_list");

    List<Product> productList=(List<Product>) productRepository.findAllById(idList);
    productRepository.deleteAll(productList);
    return ResponseEntity.status(HttpStatus.OK).body("Deleted item : "+productList);

}

答案 5 :(得分:0)

您可以使用不同的方法删除所有项目列表,而无需两次调用存储库。调用 deleteAll 方法时,CrudRepository 或 JpaRepository 只看对象 id。

List<User> userList = userIdList.stream().map(id -> {
            User user = new User();
            user.setId(id);
            return user;
        }).collect(Collectors.toList());

userRepository.deleteAll(userList);

答案 6 :(得分:0)

我用这个函数删除元素列表 在 JPA 存储库

void deleteInBatch(List<Integer> list);