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 注解的 clearAutomatically 和 flushAutomatically 属性设置为 true。查看此官方文档 Modifying Queries.
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)
尝试在 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 注解的 clearAutomatically 和 flushAutomatically 属性设置为 true。查看此官方文档 Modifying Queries.
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)