我对使用union的新SQL查询有点困惑。
我使用jaybird 2.2.8在java应用程序中请求我的firebird db。通常,我使用MetaData解析我的MetaData
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中测试查询时,所有列都有一个有效的名称。
你知道怎么回事吗?有人有办法解决吗?
顺便说一句。在eclipse调试器中,ResultSet看起来很不错。
发布于 2015-08-20 11:47:02
而不是getColumnName,您需要使用getColumnLabel。只有在保证值来自单个表中的单个列时,列名才有一个值,这在UNION中不是这样的。在UNION的情况下,Firebird只将第一个select中的列名(如果指定了别名)处理为别名(标签);它不会将列名保留为可以由getColumnName返回的列名。
如果您确实需要使用getColumnName (例如由于兼容性原因),那么您可以使用Jaybird连接属性columnLabelForName=true,但这是不允许的,因为它与JDBC不兼容。在几乎所有的情况下,您都应该使用getColumnLabel。
列名和列标签之间的区别是微妙的,在旧的JDBC规范中也不太清楚。基本上,列名是原始表中列的名称,而列标签是结果集中列的“名称”(或者更准确地说是: label)。标签要么是用AS指定的别名,要么是(如果没有指定别名) getColumnName返回的原始列名。
另请参阅:
披露:我是Jaybird开发者之一
https://stackoverflow.com/questions/32113818
复制相似问题