Spring 数据:带有注释 @Query 的方法未按预期工作
Spring Data: Method with annotation @Query doesn't work as expected
我尝试用 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
这个测试方法returnAssertionError
:Expected 0 but was 1.
这意味着 makeAllUnactive
没有改变 Entitites 的状态或改变了状态,但它们是不可见的。
你能帮我理解我的代码中 "gap" 在哪里吗?
在您的查询中:
@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
我尝试用 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
这个测试方法returnAssertionError
:Expected 0 but was 1.
这意味着 makeAllUnactive
没有改变 Entitites 的状态或改变了状态,但它们是不可见的。
你能帮我理解我的代码中 "gap" 在哪里吗?
在您的查询中:
@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