2

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

我在使用 jaybird 2.2.8 的 java 应用程序中请求我的 firebird db。通常我使用元数据解析我的 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)

返回一个空字符串而不是列名 - 列类型是有效的。

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

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

顺便提一句。ResultSet 在 Eclipse 调试器中看起来相当不错

4

1 回答 1

1

而不是getColumnName您需要使用的getColumnLabel. 只有当值保证来自单个表中的单个列时,列名才有值,而UNION. 在 a 的情况下UNION,Firebird 仅将第一个选择中的列名(或指定的别名)处理为别名(标签);它不会将列名保留为可由getColumnName.

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

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

也可以看看:

披露:我是 Jaybird 开发人员之一

于 2015-08-20T11:47:02.657 回答