【问题标题】:Why doesn't JPA CriteriaQuery provide update query?为什么 JPA CriteriaQuery 不提供更新查询?
【发布时间】:2012-04-15 16:53:42
【问题描述】:

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

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

【问题讨论】:

  • 你的愿望已经实现了:) 自 JPA 2.1 以来,CriteriaUpdate 可用

标签: hibernate jpa criteriaquery


【解决方案1】:

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

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

【讨论】:

  • 这听起来很合理。但它至少涉及两个事务,如果记录很大,例如删除一百万条记录,这种方式是不可接受的。我只是认为 CriteriaQuery 已经以 SQL 方式工作,指定一些条件然后完成工作。为什么不支持这种风格的删除/更新。无论如何,如果数量很大,目前我必须使用普通 SQL 进行批量删除/更新。
  • @zx_wing 有效点,这就是为什么 JPA 2.1 引入了CriteriaUpdate
猜你喜欢
  • 2011-12-22
  • 2015-12-17
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 2017-01-21
  • 2014-08-07
  • 1970-01-01
相关资源
最近更新 更多