Spring JPA 派生删除查询
Spring JPA derived delete query
我正在使用 Spring 数据依赖于 Spring JPA。我有一个 Spring JPA 派生的删除查询,它应该删除项目列表,但是当我执行它并注意到控制台时,我发现它正在执行 select 查询而不是我遇到过的非常奇怪的情况横跨
@RepositoryRestResource(collectionResourceRel="revision", path="revision")
interface RevisionRepository extends JpaRepository<Revision, Long> {
List<Revision> deleteByContentId(long contentId)
}
我什至尝试使用 Long 而不是 List<Revision>
不起作用,也尝试过 removeByContentId
它也不起作用并继续执行 select 查询删除查询。
当我运行这个方法是我在我的控制台上得到的
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=?
有没有人知道它为什么表现异常?
您需要在删除方法中添加 @Modifying
注释。您还需要确保它在事务中执行,因此如果您不在事务中调用此方法,则可能还需要添加 @Transactional
注释。
请看例子:
@Modifying
@Transactional
int deleteByFieldName( Long fieldValue );
最近 Spring >=5 和 Spring 启动 >=2。
@Transactional
int deleteByFieldname( Long fieldValue );
工作正常。
注1:
@Modifiyng 注释对此完全没有影响。它仅适用于 @Query 注释。没有@Query,它会被忽略。
注2:
在命名约定中,取决于配置的 NamingStrategy,CamelCase 可能被解释和嵌套实体关系或字段名称中的“_”。所以“Fieldname”和“FieldName”的意思完全不同。
注3:
像这样派生的删除查询有一个非常讨厌的 n+1 副作用。他们总是首先为行发布select,然后使用单独的删除语句逐一删除每个row/entity。没有办法解决这个问题,除非将 @Query() 与手动删除语句一起使用。然后使用@Query 需要@Modifying 来删除查询。
我正在使用 Spring 数据依赖于 Spring JPA。我有一个 Spring JPA 派生的删除查询,它应该删除项目列表,但是当我执行它并注意到控制台时,我发现它正在执行 select 查询而不是我遇到过的非常奇怪的情况横跨
@RepositoryRestResource(collectionResourceRel="revision", path="revision")
interface RevisionRepository extends JpaRepository<Revision, Long> {
List<Revision> deleteByContentId(long contentId)
}
我什至尝试使用 Long 而不是 List<Revision>
不起作用,也尝试过 removeByContentId
它也不起作用并继续执行 select 查询删除查询。
当我运行这个方法是我在我的控制台上得到的
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=?
有没有人知道它为什么表现异常?
您需要在删除方法中添加 @Modifying
注释。您还需要确保它在事务中执行,因此如果您不在事务中调用此方法,则可能还需要添加 @Transactional
注释。
请看例子:
@Modifying
@Transactional
int deleteByFieldName( Long fieldValue );
最近 Spring >=5 和 Spring 启动 >=2。
@Transactional
int deleteByFieldname( Long fieldValue );
工作正常。
注1: @Modifiyng 注释对此完全没有影响。它仅适用于 @Query 注释。没有@Query,它会被忽略。
注2: 在命名约定中,取决于配置的 NamingStrategy,CamelCase 可能被解释和嵌套实体关系或字段名称中的“_”。所以“Fieldname”和“FieldName”的意思完全不同。
注3: 像这样派生的删除查询有一个非常讨厌的 n+1 副作用。他们总是首先为行发布select,然后使用单独的删除语句逐一删除每个row/entity。没有办法解决这个问题,除非将 @Query() 与手动删除语句一起使用。然后使用@Query 需要@Modifying 来删除查询。