JDBC 介体生成的查询

如果没有提供结构化查询语言 (SQL) SELECT 语句,那么数据介体服务 (DMS) 使用实例创建中提供的元数据生成一条 SELECT 语句。

内部查询引擎使用元数据中有关表、列、关系、过滤器和排序依据的信息来构造查询。通过提供的查询,当介体将对 Datagraph 作出的更改提交回数据库时,自动为要应用的每个 DataObject 生成 UPDATE、DELETE 和 INSERT 语句。

过滤器

过滤器定义 SQL WHERE 子句,此子句可包含参数标记。将这些标记添加到 Datagraph SELECT 语句 WHERE 子句。照这样使用过滤器;不会以任何方式解析或解释这些过滤器,因此没有错误检查。如果您使用错误的名称、谓词或函数,那么不会检测出这些错误,并且生成的查询无效。如果过滤器 WHERE 子句包含参数标记,那么使用过滤器自变量定义相应的参数名称和类型。检索图之前,参数 DataObject 填充这些参 数。下面是生成的查询的过滤器和参数 DataObject 的示例。

Limitation: 由于 DataGraph 的树状结构,因此在最终与所有路径中出现的根表联合时,分支上的任何表都会出现在多个子查询中。这意味着不可能过滤出现在不依赖所有其他路径的多个路径中的表。特定表上定义的所有过滤器用布尔运算符 AND 连接,并且在该表出现的任何地方使用这些过滤器。

生成的查询的参数 DataObject

客户机使用参数 DataObject 来给出 DMS 元数据中提供的适用于过滤器的自变量。参数 DataObject 是一个数据对象,但不是任何 Datagraph 的一部分。当客户机请求参数 DataObject 时,由 JDBC DMS 构造该 DataObject。所生成查询的参数 DataObject 根据介体的元数据创建。将每张表中每个过滤器的每个自变量放入参数 DataObject。与提供的查询参数 DataObject 不同,这些参数具有过滤器自变量为它们指定的名称。参数 DataObject 使用该名称映射至要填充的参数。以下样本代码描述如何为介体元数据中的表创建过滤器。该代码还示范使用参数 DataObject 将过滤器参数值传递给介体实例。该样本假设已经定义了 Customer 表:
// The factory is a MetadataFactory object
Filter filter = factory.createFilter();
filter.setPredicate("CUSTSTATE = ? AND CUSTZIP = ?");

FilterArgument arg0 = factory.createFilterArgument();
arg0.setName("customerState");
arg0.setType(Column.String);
queryInfo.getFilterArguments().add(arg0);

FilterArgument arg1 = factory.createFilterArgument();
arg1.setName("customerZipCode");
arg1.setType(Column.Integer);
queryInfo.getFilterArguments().add(arg1);

// custTable is the Customer Table object
custTable.setFilter(filter);


..... // setting up mediator 


DataObject parameters = mediator.getParameterDataObject();

// Notice the first parameter is the name given to the 
// argument by the FilterArgument.
parameter.setString("customerState", "NY");
parameter.setInt("customerZipCode", 12345);
DataObject graph = mediator.getGraph(parameters);

Order-by

使用标识表中列的 OrderBy 对象来指定查询结果的排序以对结果进行排序。此排序可以是升序或降序。OrderBy 对象是元数据的一部分,并且会自动应用到生成的查询中。以下示例描述了按“名”对 customer 表结果进行排序:
// This example assumes that the custTable, a table in 
// the metadata, and factory, the MetaDataFactory 
// object, have already been created. 
Column firstName = ((TableImpl)custTable).getColumn("CUSTFIRSTNAME");
OrderBy orderBy = factory.createOrderBy();
orderBy.setColumn(firstName);
orderBy.setAscending(true);
metadata.getOrderBys().add(orderBy);
Limitation: 即使在元数据中的每张表上都定义了 OrderBy 对象,RDBMS 模型需要将这些对象应用到最终的查询中。这有多种含义。例如,您无法对一张表进行排序,于是将这张表与另一张表连接在一起使用并且延用第一张表的排序。因为结果集是 DataGraph 中所有表的联合,单个结果集的结构需要使用 NULL 来填充,这会影响 OrderBy 对象,特别是在非根的表中。这会造成意外结果。

外部表

外部表是 JDBC DMS 返回的 DataGraph 中不需要的元数据中定义的表。如果您要根据表中的数据过滤结果集,但是结果集中不需要该表的数据,那么外部表适用。关于具有 Customers 和 Orders 关系的这样的示例应是过滤返回定购商品的所有客户以及一年中的第一次定购日期的结果。在此情况下,您不需要任何返回的定购信息,但是您需要过滤定购信息。使 Orders 表成为外部表,它会从 DataGraph 排除订单信息,并且因此减小了 DataGraph 的大小,从而提高了效率。要将表指定为外部表,请从 JDBC DMS 元数据中的表对象调用 setExternal(true) 方法。如果客户机尝试从 Datagraph 访问外部表,会发生非法的自变量异常。

Limitation: 许多 RDBMS 需要 orderby 列出现在最终的结果集中;通常,外部表中的列无法用于对结果集排序。实际上,Orderby 被应用到结果集(此处“set”是关键词),而不是被应用到中间查询结果。

生成的查询的一般限制

了解 JDBC DMS 中查询生成功能的限制时记住两个内容。首先,Datagraph 在非直接的、可能断开连接的有环图的关系模型上建立直接的、已连接的无环图模型(即,树状模型)。直接的意味着开发者通过挑选根表来选择图的方向。已连接的意味着是 DataGraph 成员的所有表可以从根到达。不能从根到达的任何表不能包括在 Datagraph 中。为了能够从根到达表,必须至少在 Datagraph 中每对表间定义一个外键关系。 无环意味着在 DataGraph 中的一对表间只有一个外键关系。DataGraph 的树状结构确定如何构建查询以及确定从查询返回什么数据。

要记住的第二个内容是以下对查询生成如何产生 Datagraph 的读查询的高级别描述:
  1. 不管 Datagraph 是由单张表组成的还是由多张表组成的,JDBC DMS 都只创建单个结果集(即,Datagraph)。
  2. 通过 DMS 元数据中的外键关系的从根到叶的每个路径表示一个不同路径。通过路径中的表之间定义的外键使用连接检索该路径的数据。缺省情况下,该连接是内连接。
  3. 为了通过介体生成的查询来创建单个结果集,将 Datagraph 中的所有路径联合在一起,这样就可彼此无关地处理。
  4. 首先在表上执行用户定义的过滤。然后将结果与路径的其余部分连接。
  5. 通常,关系数据库需要将 OrderBy 对象应用到整个最终的结果集而不是中间结果。

指示主题类型的图标 参考主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rdat_sdogquery
文件名:rdat_sdogquery.html