EJB 查询的数据库限制
企业JavaBeans (EJB)查询功能必须遵守数据库的某些限制。
一般数据库限制
- 涉及给定查询的所有企业 bean 必须都映射至同一数据源。 EJB 查询不支持交叉数据源连接操作。
- 有可能由WebSphere® Application Server部署代码生成实用程序ejbSelectEJB 查询语言查询返回结果集中所有列均由空值组成的行。
在运行时期间,持久性管理器会将收到的集合另存为此查询的结果。 当您的应用程序检索结果 bean 的主键时,持久性管理器将调用抽取器。 该抽取器是 EJB 部署生成类的一种方法。 此方法对任何 null 列条目均返回值 0。 此值将传递回至 EJB 容器以转发至应用程序。 EJB 容器调用 PK 值为0。 这可能会产生问题,因为最终用户无法确定此 bean 实例是否具有空 PK或PK值为0 。
要避免此问题,请在 Finder 查询中使用 IS NOT NULL 子句从结果集中消除此类空值。
特定数据库限制
不同的数据库产品对可以包括在 EJB 查询语句中的元素设置不同的限制。 以下是那些限制的列表;与您的数据库管理员核实以查看您的环境中是否有任何应用:
- 某些函数用于针对以下对象运行的查询: DB2®仅限,因为其他数据库不支持这些功能。 这些函数包括日期和时间算术表达式、某些标量函数(包括未列出的函数)可跨供应商移植以及在用于映射某些容器管理持久性 (CMP) 字段时隐含的标量函数。 例如,设想将 int 数字类型映射至 decimal (5,2) 类型字段。 当针对其他数据库进行部署时DB2 ,包含具有此特定映射的 CMP 字段的查找器或选择查询将失败,并产生
Cannot push down query错误信息。 - 当映射至数据库中的字符大对象 (CLOB) 时,由于数据库不支持 CLOB 比较,因此无法在比较操作中使用类型为 String 的 CMP。
- 对于带比较运算符且用作字面值或输入参数的字符串值,数据库可以对其长度加以限制。 这些限制可能会影响查询性能。 例如:对于DB2在z/OS®平台,搜索name = ?1如果运行时 ?1 的值长度大于 255,则可能会失败。
- 将数字 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 查询中执行整数值间的除法运算。
当前版本IBM i DB2 仅支持
yyyy-mm-dd-hh.mm.ss.nnnnnn
TIMESTAMP值。 这与java.sql.Timestamp类,即年月日时mm.ss.nnnnnn
。 TIMESTAMP 标量函数应该用于将java.sql.Timestamp对象可以被识别的值DB2 UDB 用于IBM i 。