Я хочу разобрать java.sql.ResultSet на Map<String, String> и проверить три вещи:
key и иметь тип String.value и иметь тип String.Вот что у меня есть в моем классе HiveStatementOutputContent:
protected Map<String, String> keyValueOutput;
public HiveStatementOutputContent(ResultSet s) throws Exception {
if (s.findColumn("key") != 0 )
throw new Exception("Error in SQL result: First column has to be 'key'.");
if (s.findColumn("value") != 1)
throw new Exception("Error in SQL result: Second column has to be 'value'.");
//TODO: Validate type
//TODO: Validate number of columns
while ( s.next() )
{
keyValueOutput.put(s.getString(0),s.getString(1));
}
}
Как лучше всего это сделать?
@MarkRotteveel Я обнаружил это на собственном горьком опыте, но все равно спасибо.




Если вам важно, какой элемент вставляется как ключ, а какой - как значение, я думаю, что намного проще просто использовать псевдонимы столбцов при итерации по ResultSet и получении строк.
while ( s.next() )
{
keyValueOutput.put(s.getString("key"),s.getString("value"));
}
https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#getString(java.lang.String)
Вы не получаете подтверждения того, что key находится перед value в результате SQL, но вы отделяете свой бит кода от SQL, поскольку весь приведенный выше код заботится о том, что есть столбцы key и value (либо по точному имя столбца в SQL или псевдонимом AS в запросе SQL).
Если вы хотите проверить порядок столбцов, их имена и типы данных, вы можете использовать объект ResultSetMetaData, вызвав s.getMetaData(). Затем вы можете вызвать в metadata.getColumnName(int) и metadata.getColumnType(int), чтобы проверить имя столбца и тип данных. Вы также можете использовать getColumnCount, чтобы убедиться, что вы не загружаете лишние столбцы.
Видеть:
https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSetMetaData.html#getColumnName(int)https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSetMetaData.html#getColumnType(int)
Я хочу для проверки. В этом-то и дело! Пожалуйста, не думайте о том, чего я пытаюсь достичь. Я хочу показать ошибку, когда ResultDataset выглядит неправильно, даже если он может работать.
Ах, я понял, что вы хотите получить данные только по имени при использовании жестко заданных значений индекса. Я отредактировал свой ответ, чтобы добавить, как делать проверку.
Надеюсь, вы знаете, что столбцы
ResultSetначинаются с 1, а не с 0. Таким образом,s.findColumn("key")вернет никогда0(и если это так, это будет серьезной ошибкой в вашем драйвере).