现在我有一个 User 类,我从 jsp
或 html
获取 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 实体生命周期事件,例如 preRemove
和postRemove
.
如果您想真正批量删除,请使用接受的答案。
关于hibernate - 如何处理 Spring Data JPA 中 ID 数组的批量删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36763440/