EJB 介体查询语法
当您开始编写应用程序以使用产品中提供的 Enterprise JavaBeans (EJB) 数据介体服务 (DMS) 时,请考虑以下事项。
- EJB DMS 将复合 EJB 查询作为输入自变量。复合 EJB 查询由一个包含 EJB 查询语言 (QL) 语句的数组和一个可选的 XREL 命令组成。XREL 命令是一些 EJB 关系的列表并且必须位于数组末尾。
- 每个 EJB QL 查询以“服务数据对象”(SDO) 实例的形式返回数据。所有 SDO 实例合并成一个 DataGraph。每个查询的 SELECT 子句在 SDO 中指定要返回的“容器管理的持久性”(CMP) 字段或表达式。WHERE 子句指定过滤条件,并且您可以定义 ORDER BY 子句。如果两个或多个 SELECT 子句返回相同的 SDO 类型,那么每个 SELECT 子句必须设计相同的 CMP 字段和表达式。为了获得可更新能力,必须设计 EJB 的主键字段。JOIN、UNION 和聚集不受支持,但在子查询中受支持。
- 数组中的查询可以通过使用在 FROM 子句中的先前查询中定义的标识变量以及关系名称来引用这些先前查询。此关系可以是单个值或者是将集合作为值。
- 当在 FROM 子句或者 XREL 命令中使用关系时,会在图中的数据对象实例之间构造关系。
- 以集合作为值的输入自变量在 FROM 子句是受支持的。如果 ?1 表示 Dept EJB 的集合,那么以下查询对于介体是有效的。强制类型转换语法需要将集合元素类型告知查询编译器。
select d.deptno from (Dept) ?1 as d
- 当需要从高速缓存在 EJB 容器或持久性管理器数据高速缓存中的 EJB 实例来构建 DataGraph 时,集合输入自变量是很有用的。
- SELECT 子句可以指定要检索的 CMP 字段列表(通配符 * 表示法可用于检索所有 CMP 字段)或有效的 EJB 查询语言表达式。CMP 字段和表达式必须是以下某个类型:
- 基本类型:布尔、字节、短整型、整型、长整型、浮点型、双字节型、字符型
- 基本类型的对象包装器类型
- Java™.lang.String
- Java.math.BigDecimal
- java.math.BigInteger
- byte [ ]
- Java.sql.Date
- java.sql.Time
- java.sql.Timestamp
- java.util.Date
- java.util.Calendar
- 为了使“服务数据对象”(SDO) 可更新,必须按顺序检索所有主键 CMP 字段;否则,applyChanges 将返回异常。
- 无法更新来自 EJB 查询语言表达式(例如,e.salary + e.bonus AS TOTAL_PAY)的 SDO 属性。如果尝试进行更新,那么 applyChanges 将返回 QueryException。
- 聚集表达式(例如,SUM(e.salary)),即使它们是 EJB 查询语言的一部分也是不允许使用的。可以在 WHERE 子句中的子查询中使用聚集表达式。