【问题标题】:Spring data jpa deleteBy query not workingSpring数据jpa deleteBy查询不起作用
【发布时间】:2015-09-29 12:47:03
【问题描述】:

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

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 作为name3_2_ from Contact contact0_ where >contact0_.emailAddress=?

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

【问题讨论】:

    标签: java spring hibernate jpa spring-data-jpa


    【解决方案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)
    

    【讨论】:

    • 它在我用@transactional 注释方法后工作。非常感谢您,先生!注意:它也适用于 Query,但我只想要一个函数式方法查询。
    • 感谢// NOTE: you have return void - 我会尝试所有但没有想到这一点,这就是我的原因!
    • @ikumen 查询与修改和事务注释一起工作正常,但在数据库行中仍然存在
    • 只是在此列表中添加更多点:在实体中,您可能想要添加 entityManager.flush() 和 entityManager.clear()。也许一个人没有看到删除,因为上下文还没有刷新。并且 deleteBy... 在使用复合键时不会生成“预期的”查询。
    • 在我的例子中,我有一个事务方法调用一个调用 deleteBy 的非事务方法。我认为该事务会被传播(这是春季事务的默认行为),但在这种情况下,deleteBy 不起作用。当我还用@transactional 注释第二种方法时,它起作用了。
    【解决方案2】:

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

    Spring Data: "delete by" is supported?

    【讨论】:

    • 这就是我开始的地方,但它没有回答我的问题。
    • spring 首先调用查询该行,然后第二次调用使用主键删除该行...你应该看到类似 Hibernate: delete from conatact where id=?如果 id 是主键..
    【解决方案3】:

    尝试将删除查询调用移至专用于它的服务类:

    @FunctionalInterface
    public interface DeleteService {
    
        public int deleteIfExists(Date fechaProceso);
    
    }
    

    例如在 DeleteServiceImpl.java 中实现

    【讨论】:

      猜你喜欢
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 2018-05-18
      • 2019-07-16
      • 1970-01-01
      • 2016-08-26
      • 2014-01-19
      • 1970-01-01
      相关资源
      最近更新 更多