我在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=?
有没有人知道为什么它表现得很奇怪?
答案 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进行删除查询。