hibernate - 如何处理 Spring Data JPA 中 ID 数组的批量删除?

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

现在我有一个 User 类,我从 jsphtml 获取 array 的请求数据。

列出这个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_

最佳答案

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

void deleteByIdIn(List<Integer> ids);

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

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

编辑:更多细节

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

要手动添加一些简单的查询,例如搜索用户名或邮件地址,Spring 提供了一种很好的机制,无需注释任何基于字符串的 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])

更新:

这只能在 Spring Boot 版本 < 2.0 中用作真正的批量删除!

自 Spring Boot 2.0 起,它将导致单个删除查询来支持 JPA 实体生命周期事件,例如 preRemovepostRemove .

如果您想真正批量删除,请使用接受的答案。

关于hibernate - 如何处理 Spring Data JPA 中 ID 数组的批量删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36763440/

相关文章:

java - hibernate sql查询

java - StandardEvaluationContext 中的 Spring StandardTypeLocator : registering new import prefixes for use in Thymeleaf templates

java - 为什么 Spring 在处理端点异常时将 RuntimeException 包装在 NestedServletException 中?

java - 不同登录页面中的 Spring Security 和 Spring Social

java - Spring Boot中如何获取系统属性值

java - Spring Data Mongodb 存储库未正确实现继承

java.lang.ClassCastException : org. hibernate.internal.QueryImpl 无法转换为 com.models.User

java - 如何处理负载并配置 tomcat 7 服务器和应用程序,使其能够处理超过 2000 个请求

spring - JPA QBE 与 @JoinTable

java - Spring中如何saveOrUpdateAll(4.2.5.RELEASE)