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,可以访问查询派生remove和count操作.
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)
Chr*_*obl 75
从Spring Data JPA的1.6.0.RC1版本开始,支持使用给定方法名称派生删除查询.关键字remove并delete受支持.作为返回值,可以在数字或已删除实体列表之间进行选择.
Long removeByLastname(String lastname);
List<User> deleteByLastname(String lastname);
Run Code Online (Sandbox Code Playgroud)
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
如果你看一下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的版本
| 归档时间: |
|
| 查看次数: |
140938 次 |
| 最近记录: |