【发布时间】:2011-04-05 17:14:59
【问题描述】:
由于ResultSet包含动态SQL返回的数据,有没有办法判断ResultSet是否包含特定的列名?
例如,如果我运行rs.getString("Column_ABC"),但"Column_ABC" 并不真正存在,则会抛出异常。
如何测试ResultSet 是否可以从名为"Column_ABC" 的列中获取数据?
【问题讨论】:
由于ResultSet包含动态SQL返回的数据,有没有办法判断ResultSet是否包含特定的列名?
例如,如果我运行rs.getString("Column_ABC"),但"Column_ABC" 并不真正存在,则会抛出异常。
如何测试ResultSet 是否可以从名为"Column_ABC" 的列中获取数据?
【问题讨论】:
private boolean isThere(ResultSet rs, String column){
try{
rs.findColumn(column);
return true;
} catch (SQLException sqlex){
logger.debug("column doesn't exist {}", column);
}
return false;
}
【讨论】:
findColumn 命令返回并不重要。理所当然地忽略了。这个isThere 方法肯定不会总是返回true。 findColumn 如果未找到该列,则抛出 SQLException。这个答案似乎很好。
resultSet.getColumnMetaData().contains(columnName)
【讨论】:
ResultSet接口没有getColumnMetaData方法
/**
* returns default value if column is not present in resultset
*
* @param rs
* @param columnLabel
* @param defaultValue
* @return
*/
@SuppressWarnings("unchecked")
private static <T> T getValueFromResultSet(final ResultSet rs,
String columnLabel, T defaultValue) {
try {
return (T) rs.getObject(columnLabel);
} catch (SQLException e) {
return defaultValue;
}
}
在 java 版本 >=7 中,您可以选择在 ResultSet#getObject 方法中传递 Class 类型
【讨论】:
不确定这是否比 Erick 的答案更有效,但它更容易。
String str;
try {
str = rs.getString(columnName);
} catch (java.sql.SQLException e) {
str = null;
}
【讨论】:
使用ResultSetMetaData 类。
public static boolean hasColumn(ResultSet rs, String columnName) throws SQLException {
ResultSetMetaData rsmd = rs.getMetaData();
int columns = rsmd.getColumnCount();
for (int x = 1; x <= columns; x++) {
if (columnName.equals(rsmd.getColumnName(x))) {
return true;
}
}
return false;
}
我不明白为什么永远需要这个功能。正在执行的查询或存储过程应该有已知的结果。查询的列应该是已知的。需要这样的功能可能表明某处存在设计问题。
【讨论】:
getColumnName的参数是从1而不是0开始的。你需要for (int x = 1; x <= columns; x++)
AS 子句定义的名称,可以使用 ResultSetMetaData.getColumnLabel。
equalsIgnoreCase 来检查名称是否相同。在我的情况下,我在查询中有一个小写的列名,它从getColumnName() 函数以大写形式返回
JOIN 返回一列,而另一个存储过程不返回该列。仅执行所需的连接可能对性能有好处,而不是选择具有默认值的不必要的列来匹配您的应用程序可能使用的理论架构。通过拥有类似rs.containsColumn(x) 的东西,一个方法可以读取任一存储过程的结果,而不是第二个方法,它少一个rs.get***(),否则与第一个相同。没有?
如果不是 rs.getString("Column_ABC")= nothing 那么 ' 你的代码在这里
【讨论】: