【问题标题】:Spring Data: Method with annotation @Query doesn't work as expectedSpring Data:带有注释@Query 的方法无法按预期工作
【发布时间】: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 没有更改实体的状态或进行了更改,但它们是不可见的。

您能帮我了解一下我的代码中的“差距”在哪里吗?

【问题讨论】:

    标签: java junit transactions spring-data dao


    【解决方案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' 忽略它:)
    猜你喜欢
    • 2018-08-06
    • 2018-12-18
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 2016-01-21
    相关资源
    最近更新 更多