GetColumName(i) returns "" 当使用 UNION (Jaybird)

GetColumName(i) returns "" when using UNION (Jaybird)

我对使用联合的新 SQL 查询有点困惑。

我使用 jaybird 2.2.8 在 java 应用程序中请求我的 firebird 数据库。通常我使用 MetaData

解析我的 ResultSet
ResultSetMetaData metaData = resultSet.getMetaData();

并遍历列

for (int i = 1; i <= metaData.getColumnCount(); i++) {
            columnName = metaData.getColumnName(i);
            int columnType = metaData.getColumnType(i);
            switch (columnType) { ...

在我开始在我的 SQL 查询中使用 Union 之前,它一直运行良好。 现在的方法

metaData.getColumnName(i)

returns 空字符串而不是列名 - 列类型有效。

当我使用没有 Union 的 SQL 查询时,一切都按预期工作,当我在 IBExpert 中测试我的查询时,所有列都有一个有效名称。

知道有什么问题吗?有人有解决方法吗?

顺便说一句。结果集在 eclipse 调试器中看起来很好

您需要使用 getColumnLabel 而不是 getColumnName。如果值保证来自单个 table 中的单个列,则列名只有一个值,而 UNION 中不是这种情况。在 UNION 的情况下,Firebird 仅将第一个 select 中的列名(或指定的别名)作为别名(标签)处理;它不会将列名保留为可以由 getColumnName.

返回的列名

如果您确实需要使用 getColumnName(例如出于兼容性原因),那么您可以使用 Jaybird 连接 属性 columnLabelForName=true,但不鼓励这样做,因为它不兼容JDBC。在几乎所有情况下,您都应该使用 getColumnLabel

列名称和列标签之间的区别很微妙,在旧的 JDBC 规范中并不是很清楚。基本上,列名是原始 table 中列的名称,而列标签是结果集中列的 'name'(或更准确地说:标签)。标签是用 AS 指定的别名,或者 - 如果没有指定别名 - getColumnName.

返回的原始列名

另请参阅:

披露:我是 Jaybird 开发者之一