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

Hibernate 为什么JPA CriteriaQuery不提供更新查询?,hibernate,jpa,criteriaquery,Hibernate,Jpa,Criteriaquery,JPA2.0中的CriteriaQuery提供了一种类型安全的方法来进行选择,非常好。但我想知道为什么它不提供更新/删除操作?要批量更新/删除,您必须回到以前编写容易出错的SQL或JPQL文本的方式。依我看,更新/删除的标准查询应该不会很困难,因为where原因处理与select相同 希望这能在下一版本的JPA中实现。因为JPA是ORM工具,其动机是将数据库记录映射到对象,以便可以使用编程语言而不是SQL来操作数据库记录,所以不鼓励使用SQL/HQL/JPQL来执行更新 为了防止使用容易出错的S

JPA2.0中的CriteriaQuery提供了一种类型安全的方法来进行选择,非常好。但我想知道为什么它不提供更新/删除操作?要批量更新/删除,您必须回到以前编写容易出错的SQL或JPQL文本的方式。依我看,更新/删除的标准查询应该不会很困难,因为where原因处理与select相同


希望这能在下一版本的JPA中实现。

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


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

这听起来很合理。但它至少涉及两个事务,如果记录很大,例如删除一百万条记录,这种方式是不可接受的。我只是认为CriteriaQuery已经以SQL的方式工作了,它指定了一些条件,然后就开始工作了。为什么不支持这种样式的删除/更新呢。无论如何,如果数量很大,目前我必须使用普通SQL进行批量删除/更新。@zx_wing有效点,这就是为什么JPA 2.1引入CriteriaUpdate您的愿望实现了:自从JPA 2.1以来,就有CriteriaUpdate可用