EJB 查询中数据类型操作的规则
使用 Enterprise JavaBeans (EJB) 查询来处理数据类型时,必须遵循某些规则。
您可以在 SELECT 子句中使用任何类型的 CMP 字段。但是,您必须在搜索条件和分组或排列次序操作中仅使用以下类型的字段:
- 基本类型:byte、short、int、long、float、double、boolean、char
- 对象类型:Byte、Short、Integer、Long、Float、Double、BigDecimal、String、Boolean、Character、java.util.Calendar、java.util.Date
- JDBC 类型:java.sql.Date、java.sql.Time、java.sql.Timestamp
- 二进制字符串:byte
如果发生以下所有情况:
- 使用转换器将先前所列的某个基本类型的 CMP 字段映射至 SQL 列。
- CMP 字段显示在基本谓词之前
- 以下谓词为字面值或输入参数
例如,如果转换器将整数值 10 映射至字符串值“Ten”,那么以下 EJB 查询:
e.cmp = 10
转换为以下 SQL 查询:
column = 'Ten'
如果您包括更复杂的谓词,如以下示例:
e.cmp * 10 > e.salary
在 finder 或 select 查询中,您会接收到无法下推查询错误消息。使用多功能查询的动态 EJB 查询服务;动态查询运行时在应用程序服务器中处理谓词。
总的来说,转换器保留等式、整理顺序和 NULL 值。如果转换器不满足这些需求,请不要使用它来进行 CMP 字段比较操作。
无法在比较操作或表达式中使用用户类型。但是,您可以在路径表达式中使用用户类型的子字段。例如,设想类型为 com.exam.Address 的 CMP 地址字段以及街道、市/县/区和省/自治区/直辖市子字段。此 CMP 字段上的以下查询语法无效:
e.addr = ?1
但是,指定某个子字段的查询有效:
e.addr.street = ?1
使用 Java 序列化可以将 CMP 字段映射至 SQL 列。在谓词或表达式中使用 CMP 字段进行部署查询通常会导致无法下推查询错误消息。动态查询运行时通过在应用程序服务器中读取所有用户类型实例并对它们进行反序列化来处理表达式。
然而,此消耗性能的过程会降低性能。您可以通过在部署 EJB 查询中使用组合器来维护性能。在前一个示例中,如果您要将地址字段映射至二进制类型,那么使用组合器将每个子字段映射至数据库中的二进制列。