2012-04-02 61 views
5

JPA2.0中的CriteriaQuery提供了一种类型安全的方式来做select,这很好。但我想知道为什么它不会提供更新/删除操作?要批量更新/删除,您必须回到过去编写容易出错的SQL或JPQL文本。 IMO,更新/删除的CriteriaQuery不应该被证明是困难的,因为where原因处理与select相同。为什么JPA CriteriaQuery不提供更新查询?

希望这可以在下一个版本的JPA中实现。

+1

你的愿望已经成真:)自JPA 2.1有'CriteriaUpdate'可用 – 2014-09-24 07:52:37

回答

1

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

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

+4

这听起来很合理。但它涉及至少两个交易,如果记录很大,例如删除一百万条记录,这种方式是不可接受的。我只是认为CriteriaQuery已经以SQL方式工作,指定了一些条件,然后完成了工作。为什么不支持这种风格的删除/更新。无论如何,如果数量很大,我现在必须使用纯SQL进行批量删除/更新。 – 2012-04-03 00:35:58

+1

@zx_wing的有效点,这就是为什么JPA 2.1引入了“CriteriaUpdate” – 2014-09-24 07:54:05

相关问题