现在我有一个用户类,我从array
或jsp
获得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_
答案 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
使用findAllById(ids)
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);