Spring JPA派生删除查询

时间:2015-11-12 19:16:51

标签: spring hibernate spring-mvc jpa spring-data-rest

我在Spring JPA中使用Spring Data rest。我有一个Spring JPA派生删除查询,它应该删除项目列表,但是当我执行它并注意到控制台时,我发现它正在执行选择查询而不是我遇到的非常奇怪的情况。

@RepositoryRestResource(collectionResourceRel="revision", path="revision")
interface RevisionRepository extends JpaRepository<Revision, Long> {

     List<Revision> deleteByContentId(long contentId)
}

我甚至尝试使用Long而不是List<Revision>不起作用,并且还尝试了removeByContentId它也不起作用并继续执行选择查询而不是删除查询。

当我运行此方法时,这就是我在控制台上获得的内容

Hibernate: select revision0_.id as id1_2_, revision0_.body as body2_2_, revision0_.content_id as content_3_2_, revision0_.content_type as content_4_2_, revision0_.date_created as date_cre5_2_, revision0_.file_name as file_nam6_2_, revision0_.folder_id as folder_i7_2_, revision0_.force_ssl as force_ss8_2_, revision0_.is_active as is_activ9_2_, revision0_.lookup as lookup10_2_, revision0_.meta_description as meta_de11_2_, revision0_.meta_keywords as meta_ke12_2_, revision0_.meta_title as meta_ti13_2_, revision0_.nav_item as nav_ite14_2_, revision0_.nav_order as nav_ord15_2_, revision0_.regions_objects as regions16_2_, revision0_.summary as summary17_2_, revision0_.title as title18_2_, revision0_.updated_by as updated19_2_, revision0_.user_id as user_id20_2_ from revisions revision0_ where revision0_.content_id=?

有没有人知道为什么它表现得很奇怪?

2 个答案:

答案 0 :(得分:0)

您需要在删除方法中添加@Modifying注释。您还需要确保它在事务中执行,因此如果您不在事务中调用此方法,则可能还需要添加@Transactional注释。

请看一个例​​子:

@Modifying
@Transactional
int deleteByFieldName( Long fieldValue );

答案 1 :(得分:0)

最新的Spring> = 5和Spring Boot> = 2。

@Transactional
int deleteByFieldname( Long fieldValue );

工作正常。

注释1: @Modifiyng注释对此绝对没有作用。它仅适用于@Query注释。如果没有@Query,它将被忽略。

注意2: 在命名约定中,这取决于配置的NamingStrategy,可能会解释CamelCase并嵌套字段名称中的实体关系或“ _”。因此,“字段名”和“字段名”的含义完全不同。

注意3: 这样的派生删除查询确实具有令人讨厌的n + 1副作用。他们总是首先发布选择行,然后问题用单独的删除干事逐行删除每个行/实体。除了使用@Query()和手动delete语句外,无法解决此问题。然后,使用@Query要求使用@Modifying进行删除查询。