使用Java + Hibernate + DB2获取别名的正确映射的挑战

时间:2013-04-08 12:18:04

标签: java hibernate alias db2-luw

我正在使用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),但它没有改变这种情况。

1 个答案:

答案 0 :(得分:0)

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

它涉及列的“名称”与其“标签”之间的区别。 IBM记录this page处的行为,这表明不同版本的数据库驱动程序的行为会有所不同。

具体来说,这一段:

  

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

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

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

  1. 使用版本3.x驱动程序。
  2. 您可以切换为getColumnLabel上的ResultSetMetaData。这将使用DB2 LUW使用版本4+驱动程序为您提供正确的结果。这适用于我们的问题版本,但可能与Hibernate不相关或不可能。
  3. 您可以在DataSourceConnection对象上设置一个属性:useJDBC4ColumnNameAndLabelSemantics需要设置为DB2BaseDataSource.NO。但是,我不知道你是否可以通过Hibernate设置它。如果可以的话,它应该使别名表现出旧的(和属性)方式。
  4. 在我们的环境中,我们还没有决定如何最好地处理这个问题。我们正在使用选项1来解决它。我倾向于使用选项2,但我们必须支持多个数据库平台,而且我不确定它将如何与其他数据库一起工作。对于选项3,我们会唱Spring,因此设置该属性可能不切实际。