Spring Data:支持"删除"吗?

cur*_*us1 93 spring spring-data spring-data-jpa

我使用Spring JPA进行数据库访问.我能够找到像findByName和countByName这样的例子,我没有必要编写任何方法实现.我希望找到基于某些条件删除一组记录的示例.

Spring JPA是否支持deleteByName-like delete?任何指针都很受欢迎.

问候和感谢.

And*_*pin 179

不推荐的答案(Spring Data JPA <= 1.6.x):

@Modifying拯救的注释.您需要提供自定义SQL行为.

public interface UserRepository extends JpaRepository<User, Long> {
    @Modifying
    @Query("delete from User u where u.firstName = ?1")
    void deleteUsersByFirstName(String firstName);
}
Run Code Online (Sandbox Code Playgroud)

更新:

在现代版本的Spring Data JPA(> = 1.7.x)中delete,可以访问查询派生removecount操作.

public interface UserRepository extends CrudRepository<User, Long> {

    Long countByFirstName(String firstName);

    Long deleteByFirstName(String firstName);

    List<User> removeByFirstName(String firstName);

}
Run Code Online (Sandbox Code Playgroud)

  • 通常,在应用程序中,您将拥有@Service类/方法,并且这些将调用存储库.@Service公共方法应该是标记为@Transactional的方法,因为事务是基于用例的.意味着用例需要完全提交或回滚.不是每个单独的Repository方法.所以请不要在Repository方法上使用@Transactional.但是在使用存储库的Service方法上. (32认同)
  • 即使我使用1.7.4,查询方法上方也需要@Transactional注释才能成功删除 (4认同)
  • @AndreyAtapin Downvote,因为它不再是一个好的答案.也许删除它?stackoverflows缺陷之一是处理与相关库相关的版本更改/错误修正. (2认同)

Chr*_*obl 75

从Spring Data JPA的1.6.0.RC1版本开始,支持使用给定方法名称派生删除查询.关键字removedelete受支持.作为返回值,可以在数字或已删除实体列表之间进行选择.

Long removeByLastname(String lastname);

List<User> deleteByLastname(String lastname);
Run Code Online (Sandbox Code Playgroud)


P S*_*tro 8

2种方式:-

第一个自定义查询

@Modifying
@Query("delete from User where firstName = :firstName")
void deleteUsersByFirstName(@Param("firstName") String firstName);
Run Code Online (Sandbox Code Playgroud)

第二个 JPA 查询方法

List<User> deleteByLastname(String lastname);
Run Code Online (Sandbox Code Playgroud)

当您使用按方法查询(第二种方式)时,它将首先进行 get 调用

select * from user where last_name = :firstName
Run Code Online (Sandbox Code Playgroud)

然后它会在一个List中加载它然后它会一一调用delete id

delete from user where id = 18
delete from user where id = 19
Run Code Online (Sandbox Code Playgroud)

先获取对象列表,然后for循环将id一一删除

但是,第一个选项(自定义查询),

这只是一个查询,它会在值存在的地方删除。

也通过此链接https://www.baeldung.com/spring-data-jpa-deleteby


geo*_*and 7

如果你看一下Spring Data JPA的源代码,特别是PartTreeJpaQuery类,你会发现它试图实例化PartTree.在该类里面有以下正则表达式

private static final Pattern PREFIX_TEMPLATE = Pattern.compile("^(find|read|get|count|query)(\\p{Lu}.*?)??By")

应该表明什么是允许的,什么不是.

当然,如果您尝试添加这样的方法,您实际上会看到它不起作用并且您获得完整的堆栈跟踪.

我应该注意到我正在使用1.5.0.RELEASESpring Data JPA的版本