2016-04-21 901 views
3

现在我有一个班级的用户,我从jsphtml得到array的请求数据。如何处理在Spring Data JPA中通过ID数组批量删除?

榜单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_ 

回答

6

假设你有一个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)); 
} 

This w生病产生像删除查询:

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

另外要注意的Self Invocation问题,当你调用从另一个一个public建议方法。

+0

谢谢你的评论对我有帮助! – JSO

6

就以下内容添加到您的用户资料库界面

void deleteByIdIn(List<Integer> ids); 

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

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

编辑:这个

使用像CrudRepository温泉库接口豆蔻更详细,JpaRespository带来了一套基本的数据库操作,如创建,读取,更新,删除,分页,排序和等等。

要手动添加一些简单的查询,如搜索用户名称或邮件地址,spring提供了一个很好的mechnanism,而不用注释任何基于字符串的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])

+0

你好,请给代码添加一些解释 - 例如,这样做等等。虽然提供文档链接是有用的,包括这些信息对每个人都有好处。 – Chaithanya

+0

对这个解决方案只是一个警告,由于Eclipselink中的错误,这将无法正常工作(它会生成格式错误的查询),因此如果您使用的是EclipseLink,则必须重新添加对方法名称的查询。 – PaulNUK

+1

目前它的工作完美与Hibernate。另一种(并且更加灵活)的方式是使用QueryDSL(http://www.baeldung.com/rest-api-search-language-spring-data-querydsl) – LazyProphet