春季数据 jpa 删除通过查询不起作用

2022-09-01 10:45:51

我正在尝试在我的存储库中创建自定义 deleteBy 方法查询。似乎休眠不是删除,而是在做一个选择语句。

public interface ContactRepository extends JpaRepository<Contact, Integer> {

    Integer deleteByEmailAddress(String emailAddress);

    //and this one works
    Contact findContactByName(String name);
}

以下是Hibernate试图做的事情:

休眠:选择“contact0_.id”作为“id1_2_”,选择“contact0_.emailAddress”作为“>emailAdd2_2_”,contact0_.name 作为“联系人contact0_”name3_2_,其中 >contact0_.emailAddress=?

我错过了什么?我是否必须进行特殊配置才能使删除工作?


答案 1

删除是否不起作用或无法按预期工作?通常,必须先管理实体,然后才能将其删除,因此 JPA 提供程序(在您的案例中为休眠)将首先加载(您看到的查询)实体,然后发出删除。

如果您只看到查询,但没有相应的删除,则有一些可能性是:

  1. 没有什么要删除的,确保记录在数据库中
  2. 删除需要成为事务的一部分。我相信Spring数据CRUD操作默认情况下是事务性的,如果不是仅仅确保调用的任何内容都是事务性的。deleteByEmailAddress

注意:使用修改查询删除删除实体时可以避免选择,示例如下:

// NOTE: you have return void
@Modifying
@Transactional
@Query(value="delete from Contact c where c.emailAddress = ?1")
void deleteByEmailAddress(String emailAddress)

答案 2

在Spring Data JPA(>= 1.7.x)的现代版本中,可以访问删除,移除和计数操作的查询派生。

春季数据:是否支持“删除”?


推荐