【发布时间】:2010-07-26 09:36:28
【问题描述】:
考虑代码 How do I delete all JPA entities? 这里的文档http://download.oracle.com/docs/cd/E17410_01/javaee/6/tutorial/doc/gjitv.html 仅描述查询。
【问题讨论】:
标签: java orm eclipselink criteria-api jpa-2.0
考虑代码 How do I delete all JPA entities? 这里的文档http://download.oracle.com/docs/cd/E17410_01/javaee/6/tutorial/doc/gjitv.html 仅描述查询。
【问题讨论】:
标签: java orm eclipselink criteria-api jpa-2.0
Criteria API 的文档只描述了查询,因为 Criteria API 不是为 DDL 操作而设计的。实际上,我什至会说整个 JPA API 并不是为此而生的。
顺便说一句,另一个问题的代码没有显示 DDL 操作,它显示了 JPA 2.0 规范中描述的批量 DML 操作:
4.10 批量更新和删除操作
批量更新和删除操作 适用于单个实体的实体 类(连同它的子类, 如果有)。只有一个实体摘要 模式类型可以在 FROM 或 UPDATE 子句。
这些操作的语法如下 如下:
update_statement ::= update_clause [where_clause] update_clause ::= 更新实体名称 [[AS] 标识变量] SET update_item {, update_item}* update_item ::= [identification_variable.]{state_field |单值对象字段} = 新值 新值 ::= 标量表达式 | 简单实体表达式 | 无效的 delete_statement ::= delete_clause [where_clause] delete_clause ::= DELETE FROM entity_name [[AS] 标识变量]WHERE 子句的语法是 在第 4.5 节中描述。
删除操作仅适用于 指定类的实体和 它的子类。它不会级联到 相关实体。
new_value指定为 更新操作必须兼容 键入它所在的字段 已分配。批量更新直接映射到 数据库更新操作,绕过 乐观锁定检查。便携的 应用程序必须手动更新 版本列的值,如果 需要,和/或手动验证 版本列的值。
持久化上下文不是 与结果同步 批量更新或删除。
执行批量更新或删除操作时应谨慎 因为它们可能会导致 数据库之间的不一致 和活动中的实体 持久性上下文。一般来说,散装 更新和删除操作应该 仅在事务中执行 在新的持久性上下文中或之前 获取或访问其实体 状态可能会受到这样的影响 操作。
例子:
DELETE FROM Customer c WHERE c.status = ‘inactive’ DELETE FROM Customer c WHERE c.status = ‘inactive’ AND c.orders IS EMPTY UPDATE customer c SET c.status = ‘outstanding’ WHERE c.balance < 10000
【讨论】:
我认为标准 API 中没有 DDL。 JPQL 中也没有。
【讨论】: