Java GetColumnName(i)返回&引用;使用UNION时(Jaybird)

Java GetColumnName(i)返回&引用;使用UNION时(Jaybird),java,union,firebird,jaybird,Java,Union,Firebird,Jaybird,我对使用union的新SQL查询有点困惑 我使用jaybird 2.2.8在java应用程序中请求firebird db。通常我使用元数据解析我的结果集 ResultSetMetaData metaData = resultSet.getMetaData(); 然后在柱子上循环 for (int i = 1; i <= metaData.getColumnCount(); i++) { columnName = metaData.getColumnName(i);

我对使用union的新SQL查询有点困惑

我使用jaybird 2.2.8在java应用程序中请求firebird db。通常我使用元数据解析我的结果集

ResultSetMetaData metaData = resultSet.getMetaData();
然后在柱子上循环

for (int i = 1; i <= metaData.getColumnCount(); i++) {
            columnName = metaData.getColumnName(i);
            int columnType = metaData.getColumnType(i);
            switch (columnType) { ...
返回空字符串而不是列名-列类型有效

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

知道怎么了吗?有人有解决办法吗


顺便说一句,结果集在eclipse调试器中看起来非常好,而不是您需要使用的
getColumnName
。只有当值保证来自单个表中的单个列时,列名才有值,而在
联合中则不是这样。对于
联合
,Firebird仅将第一个select中的列名称(或别名,如果指定)处理为别名(标签);它不会将列名保留为可由
getColumnName
返回的列名

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

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

另见:


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

Try
getColumnLabel(I)
。作为解决方法,您可以尝试显式列标签:
。。。作为col1。。。由于col2
@JoopEggen Alias没有映射到
columnName
,只映射到
columnLabel
@MarkRotterVeel,这是一个很好的解释。但在我看来,这在
getColumnName
中的java文档返回列名与在getColumnLabel中返回建议的列标题之间并不明显。特别是对于doc fom
getColumnLabel
“如果未指定SQL
AS
,则从*
getColumnLabel
返回的值将与*
getColumnName
方法返回的值相同。”@不幸的是,Maick columnName columnLabel是JDBC中不是100%清楚的东西之一(尽管它比JDBC 2.0 iirc中指定的东西有所改进)。Firebird的一个实现细节是这里没有传达任何列名;在这种情况下,可能会有填充columnName的数据库,但是您几乎总是需要使用columnLabel(例如,从结果集中检索值是通过列索引或列标签完成的),因此我不会详细讨论它。
metaData.getColumnName(i)