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