Spring 数据 JPA - JPQL 更新查询 - 打印出未更新的值

Spring Data JPA - JPQL update query - printing out unupdated value

尝试在 Spring Data JPA 中执行更新查询。在我的测试方法(见下文)中,我用 firstName="Bill" 和 lastName="Smith" 保存了一名学生。鉴于 studentRespository.findByFirstName("John") 实际上给出了一个包含一个成员的列表,我怎么会把“Bill”打印到控制台(最后一行)? 任何帮助表示赞赏...

    @Modifying(flushAutomatically = true)
    @Transactional
    @Query("update Student s set s.firstName = ?1 where s.lastName= ?2")
    public void updateFirstNameByLastName(String firstName, String lastName)

    @Test
    public void updateStudentFirstNameByLastName() {
        studentRepository.save(student); //student.firstName="Bill", student.lastName="Smith"
        studentRepository.updateFirstNameByLastName("John", "Smith");
        List<Student> studentList = studentRepository.findByFirstName("John"); // size 1
        System.out.println(studentList.get(0).getFirstName()); // "Bill"
    }

我猜你的测试没有向数据库提交任何内容

尝试将@Rollback(value = false) 添加到测试中class 可能会有帮助

根据 JPA 的实体生命周期状态 save() 方法可能不会立即将您的更改写入数据库。

由于我们在更新查询中使用了@Modifying,这会触发注释给方法的查询作为更新查询而不是选择查询。

出现上述问题的原因是,当我们保存()时,具有过时实体的持久化上下文可能在执行修改查询后仍然存在。 EntityManager不要自动清除它。如果你希望 EntityManager 自动成为 cleared/flushed,你可以设置 @Modifying 注解的 clearAutomaticallyflushAutomatically 属性设置为 true。查看此官方文档 Modifying Queries.

Annotation Type Modifying

clearAutomatically(true/false) - 定义我们是否应该在执行修改查询后清除底层持久化上下文。 (默认-false)

flushAutomatically(true/false) - 定义我们是否应该在执行修改查询之前刷新底层持久化上下文。 (默认-false)

将此 @Modifying(clearAutomatically = true, flushAutomatically = true) 添加到 updateFirstNameByLastName 方法中,如下所示。

@Modifying(clearAutomatically = true, flushAutomatically = true)
@Transactional
@Query("update Student s set s.firstName = ?1 where s.lastName= ?2")
public void updateFirstNameByLastName(String firstName, String lastName)