2

我正在使用 Hibernate 和 IBM DB2 9.7 LUW 为数据库编写 Java 应用程序。我正在使用 SQLQuery API 读取自定义 SQL 查询字符串并针对数据库执行它。该查询包含别名,即SELECT WORK.EMPLOYEE AS WORKEMPLOYEE,仅作为示例。

使用list()命令从 DB 检索结果集时,结果map不包含别名作为键。所以写作map.containsKey("WORKEMPLOYEE")返回false。我也尝试过使用query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE),但并没有改变这种情况。

4

1 回答 1

0

我不了解 Hibernate,但我怀疑这是我们看到的有关 DB2 LUW 和别名的问题的症状。

它涉及到列的“名称”和它的“标签”之间的区别。IBM 在此页面记录了该行为,这表明该行为会随着数据库驱动程序的不同版本而有所不同。

具体来说,这一段:

查询的 SELECT 列表中的列是否有 AS 子句。对于 IBM Data Server Driver for JDBC and SQLJ Version 4.0 之前的 JDBC 驱动程序,如果查询的 SELECT 列表中的列包含 AS 子句,则 ResultSetMetaData.getColumnName 返回 AS 子句的参数。在 IBM Data Server Driver for JDBC and SQLJ Version 4.0 下,ResultSetMetaData.getColumnName 返回表列名。

建议您看到您(和我)认为有问题的行为,因为您使用的是版本 4+ 驱动程序。

有三种可能的解决方案,没有一个是完全令人满意的。

  1. 使用版本 3.x 驱动程序。
  2. 您可以切换到getColumnLabelResultSetMetaData. 对于使用版本 4+ 驱动程序的 DB2 LUW,这将为您提供正确的结果。这适用于我们的问题版本,但可能与 Hibernate 无关或不可能。
  3. 您可以在DataSourceorConnection对象上设置一个属性:useJDBC4ColumnNameAndLabelSemantics需要设置为DB2BaseDataSource.NO. 但是,我不知道您是否可以通过 Hibernate 进行设置。如果可以的话,它应该使别名表现出旧的(和属性)的方式。

在我们的环境中,我们还没有决定如何最好地处理这个问题。我们目前正在使用选项 1 解决它。我倾向于使用选项 2,但我们必须支持多个数据库平台,我不确定它如何与其他平台一起使用。对于选项 3,我们使用 Spring,因此设置该属性可能不切实际。

于 2014-11-11T11:48:25.723 回答