CriteriaQuery提供了一种类型安全的选择方式,非常棒。但我想知道为什么它不提供更新/删除操作?要进行批量更新/删除,您必须回到以前编写容易出错的SQL或JPQL文本的时代。IMO,更新/删除的标准查询不应被证明是困难的,因为原因处理与选择相同。
希望这将在JPA的下一个版本中实现。
因为JPA是ORM工具,其动机是将数据库记录映射到对象,以便可以使用编程语言而不是SQL来操作数据库记录,所以它不鼓励使用SQL/HQL/JQL来执行更新。
为了防止使用易出错的SQL或JPQL来更新对象,一旦使用CriteriaQuery
检索对象列表,就可以简单地遍历结果对象,然后逐个更改对象的属性,以便进行批量更新或删除。JPA应该能够检测对这些对象所做的更改,并在调用EntityManager.flush()
时生成合适的SQL来更新批处理中的相应记录。