【问题标题】:How to write DDL in the criteria API?如何在条件 API 中编写 DDL?
【发布时间】:2010-07-26 09:36:28
【问题描述】:

【问题讨论】:

    标签: java orm eclipselink criteria-api jpa-2.0


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

      我认为标准 API 中没有 DDL。 JPQL 中也没有。

      【讨论】:

      • 没有从 DDL 中删除?所以至少在 JPQL 中有。
      猜你喜欢
      • 1970-01-01
      • 2011-12-23
      • 2016-10-25
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 1970-01-01
      • 2016-11-27
      相关资源
      最近更新 更多