由于ResultSet
包含从动态SQL返回的数据,是否有任何方法确定ResultSet
包含是否包含特定的列名?
例如,如果我跑步rs.getString("Column_ABC")
但"Column_ABC"
实际上并不存在,它将抛出异常。
我如何测试是否ResultSet
可以从名为的列中获取数据"Column_ABC"
?
Answers:
使用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;
}
我不明白的是为什么会需要此功能。正在执行的查询或存储过程应具有已知结果。查询的列应该是已知的。需要这样的功能可能表明某处存在设计问题。
ResultSetMetaData.getColumnLabel
如果您有兴趣获取由AS
SQL查询子句定义的名称,则可以使用。
equalsIgnoreCase
检查名称是否相同。在我的情况下,我在查询中使用了小写的列名,该列名从getColumnName()
函数中以大写形式返回
JOIN
,而另一个存储的proc不返回该列。仅执行所需的联接可能对性能有好处,而不是选择不必要的具有默认值的列以匹配您的应用可能消耗的理论架构。通过使用类似的rs.containsColumn(x)
方法,一个方法可以读取任何一个存储的proc的结果,而不是第二个方法(少一个)rs.get***()
,该方法与第一个方法相同。没有?
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
,并且始终返回true。请先验证,然后再发布答案。
findColumn
在这种情况下,命令返回并不重要。理应忽略。此isThere
方法肯定并不总是返回true。findColumn
如果找不到该列,则抛出SQLException。这个答案似乎很好。
不知道这是否比Erick的回答有效或更低,但是更容易。
String str;
try {
str = rs.getString(columnName);
} catch (java.sql.SQLException e) {
str = null;
}
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方法中传递类类型
getColumnName
其参数应从1而不是0开始。您需要for (int x = 1; x <= columns; x++)