EJB 查询的数据库限制

企业JavaBeans (EJB)查询功能必须遵守数据库的某些限制。

一般数据库限制

  • 涉及给定查询的所有企业 bean 必须都映射至同一数据源。 EJB 查询不支持交叉数据源连接操作。
  • 有可能由WebSphere® Application Server部署代码生成实用程序ejbSelectEJB 查询语言查询返回结果集中所有列均由空值组成的行。

    在运行时期间,持久性管理器会将收到的集合另存为此查询的结果。 当您的应用程序检索结果 bean 的主键时,持久性管理器将调用抽取器。 该抽取器是 EJB 部署生成类的一种方法。 此方法对任何 null 列条目均返回值 0。 此值将传递回至 EJB 容器以转发至应用程序。 EJB 容器调用 PK 值为0。 这可能会产生问题,因为最终用户无法确定此 bean 实例是否具有空 PKPK值为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]当前版本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 。