由于
ResultSet
包含动态SQL返回的数据,是否有方法判断ResultSet
是否包含特定列名?
例如,如果我运行
rs.getString("Column_ABC")
但 "Column_ABC"
并不真正存在,它会抛出异常。
如何测试
ResultSet
是否可以从名为 "Column_ABC"
的列获取数据?
使用
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;
}
我不明白的是为什么需要这个功能。正在执行的查询或存储过程应该具有已知的结果。查询的列应该是已知的。需要这样的功能可能表明某处存在设计问题。
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;
}
不确定这是否比埃里克的答案效率更高或更低,但它更容易。
String str;
try {
str = rs.getString(columnName);
} catch (java.sql.SQLException e) {
str = null;
}
if(Objects.nonNull(((ResultSetImpl) resultSet).getColumnDefinition()) && Objects.nonNull(((ResultSetImpl) resultSet).getColumnDefinition().getColumnLabelToIndex()) && Objects.nonNull(((ResultSetImpl) resultSet).getColumnDefinition().getColumnLabelToIndex().get(columnName))) {
return true;
}
resultSet.getColumnMetaData().contains(columnName)
/**
* 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 类型
如果不是 rs.getString("Column_ABC")= 则什么也没有 ' 你的代码在这里