EJB 查询的数据库限制
Enterprise JavaBeans (EJB) 查询功能必须遵循数据库的某些限制。
一般数据库限制
- 涉及给定查询的所有企业 bean 必须都映射至同一数据源。EJB 查询不支持交叉数据源连接操作。
- 由 WebSphere® Application Server 部署代码生成实用程序为 ejbSelect EJB 查询语言查询生成的结构化查询语言 (SQL) 语句可能在结果集中返回所有列中均包含空值的行。
在运行时期间,持久性管理器会将收到的集合另存为此查询的结果。当您的应用程序检索结果 bean 的主键时,持久性管理器将调用抽取器。该抽取器是 EJB 部署生成类的一种方法。此方法对任何 null 列条目均返回值 0。此值将传递回至 EJB 容器以转发至应用程序。EJB 容器用 PK 值 0 调用 bean 实例。这可能导致问题,这是因为最终用户无法确定此 bean 实例具有的是 null PK 还是 PK 值 0。
要避免此问题,请在 Finder 查询中使用 IS NOT NULL 子句从结果集中消除此类空值。
特定数据库限制
不同的数据库产品对可以包括在 EJB 查询语句中的元素设置不同的限制。以下是那些限制的列表;与您的数据库管理员核实以查看您的环境中是否有任何应用:
- 因为其他数据库不支持这些函数,所以某些函数仅在 DB2® 中运行的查询中使用。这些函数包括日期和时间算术表达式、某些标量函数(包括不列为在供应商之间可移植的那些函数)和映射某些容器受管持久性 (CMP) 字段时所用的隐含的标量函数。例如,设想将 int 数字类型映射至 decimal (5,2) 类型字段。当在非 DB2 的数据库上部署时,包含带此特定映射的 CMP 字段的 finder 或 select 查询会发生故障,产生无法下推查询错误消息。
- 当映射至数据库中的字符大对象 (CLOB) 时,由于数据库不支持 CLOB 比较,因此无法在比较操作中使用类型为 String 的 CMP。
- 对于带比较运算符且用作字面值或输入参数的字符串值,数据库可以对其长度加以限制。这些限制可能会影响查询性能。例如:对于 z/OS® 平台上的 DB2,如果在运行时 ?1 值的长度大于 255,那么搜索“name = ?1”可能会失败。
- 将数字 CMP 类型映射至包含不同类型的列可能会导致意外结果。例如,设想将 int 数字类型映射至 decimal (5,2) 类型的列的情形。在从数据库传送到企业 bean CMP 字段并再返回到数据库的过程中,此方案不保存精确的十进制值(例如,值 12.25)。此映射导致使用整数(此例中为 12)替换初始值。因此,当 CMP 字段使用此性质的映射时,不要在比较操作中使用 CMP 字段。
- 某些数据库不支持与 java.sql.Time 语义对应的数据类型。例如,如果 java.sql.Time 类型的 CMP 字段映射至 Oracle DATE 列,那么时间的比较可能不会产生期待的结果,原因是在映射中列值的 year-month-day 部分被截断了。
- 某些数据库将零长度字符串值 ('') 视作 null 值;此方法可能会影响查询结果。出于可移植性的考虑,请不要使用零长度字符串值。
- 某些数据库使用整数算术规则在两个整数值之间执行除法运算,而其他数据库使用非整数规则。在两种数据库都使用的环境中可能不希望有此差异。出于可移植性的考虑,请不要在 EJB 查询中执行整数值间的除法运算。
UDB DB2 for i5/OS™ i 的当前Current®发行版仅支持格式为“yyyy-mm-dd-hh.mm.ss.nnnnnn”的 TIMESTAMP 值。这与 java.sql.Timestamp 类所支持的标准格式(“yyyy-mm-dd-hh mm.ss.nnnnnn”)不兼容。TIMESTAMP 标量函数应用于将 java.sql.Timestamp 对象的字符串表示转换为 DB2 UDB for IBM i 可以识别的值。