Java.sql: проверка формата ResultSet

Я хочу разобрать 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));
    }
}

Как лучше всего это сделать?

Надеюсь, вы знаете, что столбцы ResultSet начинаются с 1, а не с 0. Таким образом, s.findColumn("key") вернет никогда0 (и если это так, это будет серьезной ошибкой в ​​вашем драйвере).

Mark Rotteveel 14.03.2018 18:33

@MarkRotteveel Я обнаружил это на собственном горьком опыте, но все равно спасибо.

Markus Appel 15.03.2018 10:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
296
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вам важно, какой элемент вставляется как ключ, а какой - как значение, я думаю, что намного проще просто использовать псевдонимы столбцов при итерации по 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 выглядит неправильно, даже если он может работать.

Markus Appel 14.03.2018 18:01

Ах, я понял, что вы хотите получить данные только по имени при использовании жестко заданных значений индекса. Я отредактировал свой ответ, чтобы добавить, как делать проверку.

ryanlutgen 14.03.2018 18:26

Другие вопросы по теме