为什么JPA CriteriaQuery不提供更新查询?

zx_*_*ing 5 hibernate jpa criteriaquery

JPA2.0中的CriteriaQuery提供了一种类型安全的选择方法,它非常棒.但我想知道它为什么不提供更新/删除操作?要批量更新/删除,您必须回到旧时编写容易出错的SQL或JPQL文本.IMO,更新/删除的CriteriaQuery不应该证明是困难的,因为where cause处理与select相同.

希望这将在下一版本的JPA中实现.

Ken*_*han 2

因为JPA是ORM工具,其动机是将数据库记录映射到对象,以便可以使用编程语言而不是SQL来操作数据库记录,所以它不鼓励使用SQL/HQL/JPQL来执行更新。

为了防止使用容易出错的 SQL 或 JPQL 来更新对象,一旦您使用CriteriaQuery检索对象列表,您可以简单地循环遍历结果对象,然后逐一更改对象的属性,以便进行批量操作更新或删除。JPA应该能够检测到对这些对象所做的更改,并在调用时生成合适的SQL来批量更新相应的记录EntityManager.flush()

  • 这听起来似乎很合理。但它至少涉及两次事务,如果记录很大,例如删除一百万条记录,这种方式是不可接受的。我只是认为 CriteriaQuery 已经以 SQL 方式工作,指定一些条件然后完成工作。为什么不支持这种风格的删除/更新呢?无论如何,目前如果数量很大,我必须使用普通 SQL 来批量删除/更新。 (5认同)
  • @zx_wing 有效点,这就是 JPA 2.1 引入 `CriteriaUpdate` 的原因 (2认同)