Spring数据:";删去“;支持什么?

Spring数据:";删去“;支持什么?,spring,spring-data,spring-data-jpa,Spring,Spring Data,Spring Data Jpa,我使用SpringJPA进行数据库访问。我能够找到一些例子,比如findByName和countByName,我不需要为它们编写任何方法实现。我希望能找到一些基于某些条件删除一组记录的例子 Spring JPA是否像delete一样支持deleteByName?任何一个指针都很感激 问候并感谢。不推荐的答案(Spring数据JPA如果您查看Spring数据JPA的源代码,尤其是PartTreeJPQuery类,您将看到is尝试实例化PartTree。 在该类中,以下正则表达式 private s

我使用SpringJPA进行数据库访问。我能够找到一些例子,比如findByName和countByName,我不需要为它们编写任何方法实现。我希望能找到一些基于某些条件删除一组记录的例子

Spring JPA是否像delete一样支持deleteByName?任何一个指针都很感激


问候并感谢。

不推荐的答案(Spring数据JPA如果您查看Spring数据JPA的源代码,尤其是
PartTreeJPQuery
类,您将看到is尝试实例化
PartTree
。 在该类中,以下正则表达式

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

应该指出什么是允许的,什么是不允许的

当然,如果您尝试添加这样一个方法,您将实际看到它不起作用,您将获得完整的stacktrace


我应该注意到,我使用的是查看版本
1.5.0。Spring数据JPA的RELEASE
从Spring数据JPA的版本开始,支持使用给定方法名派生删除查询。支持关键字
remove
delete
。作为返回值,可以在数字或删除实体

Long removeByLastname(String lastname);

List<User> deleteByLastname(String lastname);
长removeByLastname(字符串lastname);
列表deleteByLastname(字符串lastname);

如果您将使用spring JPA直接提供的预定义删除方法,那么框架将执行以下两个查询

  • 首先使用执行select查询和delete查询where子句收集数据(如id和其他列)

  • 然后在获得第一次查询的结果集后,将对所有id执行第二次删除查询(一个接一个)

    注意:对于您的应用程序来说,这不是一种优化的方式,因为对于单个MYSQL delete查询将执行许多查询

这是删除查询代码的另一种优化方式,因为使用以下自定义方法只能执行一个删除查询



@NamedNativeQueries({

@NamedNativeQuery(name = "Abc.deleteByCreatedTimeBetween",
            query = "DELETE FROM abc WHERE create_time BETWEEN ?1 AND ?2")
    ,

    @NamedNativeQuery(name = "Abc.getByMaxId",
            query = "SELECT max(id) from abc")
})

@Entity
public class Abc implements Serializable {

}

@Repository
public interface AbcRepository extends CrudRepository {

    int getByMaxId();

    @Transactional
    @Modifying
    void deleteByCreatedTimeBetween(String startDate, String endDate);
}


使用派生查询进行批量删除时要小心。 这不是你所期望的:

2种方式:-

第一个自定义查询

@Modifying
@Query("delete from User where firstName = :firstName")
void deleteUsersByFirstName(@Param("firstName") String firstName);
第二种方法的JPA查询

List<User> deleteByLastname(String lastname);
然后它将把它加载到一个列表中 然后它将逐个调用delete id

delete from user where id = 18
delete from user where id = 19
首先获取对象列表,然后for循环逐个删除id

delete from user where id = 18
delete from user where id = 19
但是,第一个选项(自定义查询)

这只是一个查询 它将删除存在该值的任何位置


也浏览此链接

是,支持deleteBy方法
要使用它,您需要使用@Transactional注释方法。下面是我的2美分。您也可以使用本机查询,如:

@Modifying
@Query(value="delete from rreo r where r.cod_ibge = ?1 and r.exercicio= ?2", nativeQuery = true)
void deleteByParameters(Integer codIbge, Integer exercicio);
它只起作用

import org.springframework.transaction.annotation.Transactional;

    @Transactional
    Long removeAddressByCity(String city);

@AndreyAtapin拒绝投票,因为这不再是一个好答案。可能会删除它吗?stackoverflows的一个缺陷是处理与相关库相关的版本更改/错误修复。@webgeek,我曾经用
delete FROM x,其中id=?1或parent\u id=?1
。顺便说一句,请确保在
parent中没有类型__id
(您是否有意采用双低破折号?)。但为什么要使用本机查询选项?即使我使用1.7.4,查询方法上方也需要@Transactional注释才能成功删除。通常,在应用程序中,您将拥有@Service类/方法,这些类/方法将调用存储库。而@Service public方法应该是标记为@Transactional的方法因为事务是基于用例的。这意味着用例需要完全提交或回滚。而不是每个存储库方法。因此,请不要在存储库方法上使用@Transactional。但在使用存储库的服务方法上使用@Transactional。如果您多次调用repo,则在repo时生成@Transactional意味着内部服务,每个方法都将有差异事务,所以在1个查询内回滚。如果您在服务级别提供,您的整个功能将在出现任何错误时回滚。感谢您提供的信息!您好。如果您指的是RBAR(一行一行),您可以将其添加到您的答案中吗?(我将向上投票)。我有点猜你在这里指的是什么。你能更明确地阐明你的意思吗?欢迎来到堆栈溢出。在回答一个有公认答案的老问题之前(寻找绿色)✓) 与其他答案一样,确保您的答案添加了新的内容,或在其他方面对它们有所帮助。此外,仅发布代码而不做任何解释也没有什么帮助,因为它无法解释为什么或如何回答问题。请提高您的帖子质量。请参阅。
@Modifying
@Query(value="delete from rreo r where r.cod_ibge = ?1 and r.exercicio= ?2", nativeQuery = true)
void deleteByParameters(Integer codIbge, Integer exercicio);
@Query(value = "delete from addresses u where u.ADDRESS_ID LIKE %:addressId%", nativeQuery = true)
void deleteAddressByAddressId(@Param("addressId") String addressId);
import org.springframework.transaction.annotation.Transactional;

    @Transactional
    Long removeAddressByCity(String city);