JDBC 介体生成的查询
如果没有提供结构化查询语言 (SQL) SELECT 语句,那么数据介体服务 (DMS) 使用实例创建中提供的元数据生成一条 SELECT 语句。
内部查询引擎使用元数据中有关表、列、关系、过滤器和排序依据的信息来构造查询。通过提供的查询,当介体将对 Datagraph 作出的更改提交回数据库时,自动为要应用的每个 DataObject 生成 UPDATE、DELETE 和 INSERT 语句。
过滤器
过滤器定义 SQL WHERE 子句,此子句可包含参数标记。将这些标记添加到 Datagraph SELECT 语句 WHERE 子句。照这样使用过滤器;不会以任何方式解析或解释这些过滤器,因此没有错误检查。如果您使用错误的名称、谓词或函数,那么不会检测出这些错误,并且生成的查询无效。如果过滤器 WHERE 子句包含参数标记,那么使用过滤器自变量定义相应的参数名称和类型。检索图之前,参数 DataObject 填充这些参 数。下面是生成的查询的过滤器和参数 DataObject 的示例。
生成的查询的参数 DataObject
// 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
// 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);
外部表
外部表是 JDBC DMS 返回的 DataGraph 中不需要的元数据中定义的表。如果您要根据表中的数据过滤结果集,但是结果集中不需要该表的数据,那么外部表适用。关于具有 Customers 和 Orders 关系的这样的示例应是过滤返回定购商品的所有客户以及一年中的第一次定购日期的结果。在此情况下,您不需要任何返回的定购信息,但是您需要过滤定购信息。使 Orders 表成为外部表,它会从 DataGraph 排除订单信息,并且因此减小了 DataGraph 的大小,从而提高了效率。要将表指定为外部表,请从 JDBC DMS 元数据中的表对象调用 setExternal(true) 方法。如果客户机尝试从 Datagraph 访问外部表,会发生非法的自变量异常。
生成的查询的一般限制
了解 JDBC DMS 中查询生成功能的限制时记住两个内容。首先,Datagraph 在非直接的、可能断开连接的有环图的关系模型上建立直接的、已连接的无环图模型(即,树状模型)。直接的意味着开发者通过挑选根表来选择图的方向。已连接的意味着是 DataGraph 成员的所有表可以从根到达。不能从根到达的任何表不能包括在 Datagraph 中。为了能够从根到达表,必须至少在 Datagraph 中每对表间定义一个外键关系。 无环意味着在 DataGraph 中的一对表间只有一个外键关系。DataGraph 的树状结构确定如何构建查询以及确定从查询返回什么数据。
- 不管 Datagraph 是由单张表组成的还是由多张表组成的,JDBC DMS 都只创建单个结果集(即,Datagraph)。
- 通过 DMS 元数据中的外键关系的从根到叶的每个路径表示一个不同路径。通过路径中的表之间定义的外键使用连接检索该路径的数据。缺省情况下,该连接是内连接。
- 为了通过介体生成的查询来创建单个结果集,将 Datagraph 中的所有路径联合在一起,这样就可彼此无关地处理。
- 首先在表上执行用户定义的过滤。然后将结果与路径的其余部分连接。
- 通常,关系数据库需要将 OrderBy 对象应用到整个最终的结果集而不是中间结果。