Spring Data:带有注释@Query 的方法无法按预期工作
Posted
技术标签:
【中文标题】Spring Data:带有注释@Query 的方法无法按预期工作【英文标题】:Spring Data: Method with annotation @Query doesn't work as expected 【发布时间】:2015-12-19 08:45:02 【问题描述】:我尝试用junit
测试覆盖我的Repository
代码,但出乎意料的是我遇到了以下问题:
@Test
@Transactional
public void shoudDeactivateAll()
/*get all Entities from DB*/
List<SomeEntity> someEntities = someEntityRepository.findAll();
/*for each Entity set 1 for field active*/
someEntities.forEach(entity ->
entity.setActive(1);
/*save changes*/
SomeEntityRepository.save(entity););
/*call service, which walks through the whole rows and updates "Active" field to 0.*/
unActiveService.makeAllUnactive();
/*get all Entities again
List<SomeEntity> someEntities = SomeEntityRepository.findAll();
/*check that all Entities now have active =0*/
someEntities.forEach(entity -> AssertEquals(0, entity.getActive()););
在哪里:
makeAllUnactive()
方法只是一个@Query
:
@Modifying
@Query(value = "update SomeEntity e set v.active=0 where v.active =1")
public void makeAllUnactive();
并且:someEntityRepository
扩展 JpaRepository
这个测试方法返回AssertionError
:Expected 0 but was 1.
这意味着makeAllUnactive
没有更改实体的状态或进行了更改,但它们是不可见的。
您能帮我了解一下我的代码中的“差距”在哪里吗?
【问题讨论】:
【参考方案1】:在您的查询中:
@Query(value = "update SomeEntity e set v.active=0 where v.active =1")
你应该把它改成:
@Query(value = "update SomeEntity e set e.active=0 where e.active =1")
如果这不起作用,请在运行 SomeEntityRepository.save(entity);
后尝试刷新
编辑:
您应该在@Modifying
中启用clearAutomatically
标志,以便EntityManager
将得到更新。但是请记住,它也可能导致丢失所有未刷新的更改。如需更多阅读内容,请查看:
http://docs.spring.io/spring-data/jpa/docs/1.5.0.M1/reference/htmlsingle/#jpa.modifying-queries
【讨论】:
哦,'v.active' 是我的错别字。在代码中:'e.active' 忽略它:)以上是关于Spring Data:带有注释@Query 的方法无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 Spring Data @Query 注释值中使用常量?
使用 Spring Data JPA 和 @Query 注释仅获取第一个/最后一个元素
带有 nativeQuery 的 Spring Boot Query 注释在 Postgresql 中不起作用
带有分页的 Spring Data 和 Native Query
是否可以在 Spring Data JPA Repository 的 @Query 注释中使用 PostgreSQL 匿名块(PL/pgSQL)?