2017-02-03 3 views
2

Каждая строка в моей БД будет как этотИспользование RowMapper вернуться Map <String, Map <String, List <Object> >>

School Class StudentID Name Age 
123  8  811  John 10 
123  8  812  Smith 11 
123  8  821  John 12 
123  8  822  Smith 13 
123  9  911  John 14 
123  9  912  Smith 15 
456  8  811  John 10 
456  8  812  Smith 11 

Теперь я хочу, чтобы вернуть вышеуказанные данные, как это

Map<String,Map<String,List<Object>>> 

ie. Map<School,Map<Class,List<StudentID>>> 

Я использую Spring JdbcTemplate с RowMapper, но все, что я могу получить, это список всех строк. Поскольку я не смогу поддерживать свою основную карту в своем RowMapper (, могу ли я иметь статическую карту внутри класса RowMapper? Но я не хочу, чтобы она была статичной, так как это веб-сервис, и последующие вызовы могут быть завинчены.) , У меня есть только возможность получить этот список Row, а затем у меня есть логика для создания коллекции, которую я хочу.

Я узнал о ResultSetExtractor, но не смог найти, как это сделать, используя это.

Пожалуйста, дайте мне знать, если есть какой-либо способ, которым я могу это сделать, используя сопоставление строк или какой-либо вид. Или мой единственный способ решить это - мне снова повторить список и получить то, что я хочу.

EDIT: Мой запрос является запрос на выборку, как это:

SELECT * from TABLENAME 

и это на самом деле занимает 40 минут, чтобы получить ResultSet от Java.

Поскольку вызов БД предназначен для заполнения объекта кеша, который выполняется с использованием CRON каждые 4 часа, я не возражаю против временной задержки 40 минут с момента фактических вызовов REST, будет ссылаться на объект кеша. Но все же я хочу сделать это максимально эффективно.

Также, пожалуйста, дайте мне знать, если есть какой-либо другой способ, которым я могу справиться с этим сценарием. Обычный вызов jdbc для каждого вызова REST будет дорогостоящим, так как мы будем получать 100 запросов в секунду.

+0

Я предполагаю, что у вас есть 'DAO' класс для каждого из субъектов? Почему бы не позволить вашему DAO преобразовать «Список» в «Карта» и вернуть его во внешний мир? – CKing

+0

Вызов jdbcTemplate находится внутри DAO, я хочу знать, можно ли это сделать с помощью RowMapper. – v1shnu

+0

Итак, вы в основном хотите, чтобы 'JdbcTemplate' формировал« карту »для вас, когда вы выполняете запрос с ней? Я полагаю, что любое решение, которое вы реализуете, в конечном итоге просто преобразует «Список» в «Карту» внутри, поэтому почему бы не позволить вашему «DAO» сделать это? – CKing

ответ

1

RowMapper

Вы могли бы реализовать состояние полной RowMapper, который решает проблему, но это на самом деле не соответствуют идее RowMapper, который, как полагают, являются лицами без гражданства и многоразовые, как указано в JavaDoc:

... объекты RowMapper, как правило, без гражданства и, следовательно, многоразовые ...

RowMapper является используется для преобразования строк в объект, что означает, что каждая строка ResultSet получает собственный Объект.

ResultSetExtractor

Это действительно ResultSetExtractor, что соответствует вашей задачи. ResultSetExtractor выполнен для ResultSet для преобразования объектов, как вы намереваетесь сделать.

Просто осуществить заполнение карты там итерируя ResultSet и передать экземпляр ResultSetExtractor реализации на ваш JdbcTemplate.query(...) вызова.


Обновление 2017-02-09

Следуя комментарий, что пример использования ResultSetExtractor будет полезно, я наткнулся на интерфейс RowCallbackHandler. Хотя оба варианта позволяют реализовать желаемое поведение, RowCallbackHandler обрабатывает итерацию . Его можно использовать также через звонок JdbcTemplate.query(...).

Примеры обоих RowCallbackHandler и ResultSetExtractor я рекомендую следующую статью Ram Сатиш: http://www.javarticles.com//2015/02/example-of-spring-callbacks-used-in-jdbctemplate.html

+0

Спасибо. Но строит ли я фактическую карту сразу после того, как я делаю вызов jdbc эффективным? (производительность разумна.) Для запроса 'SELECT * from TABLE', который я использую, для завершения требуется 40 минут. И если я хочу снова создать карту, мне придется снова и снова перебирать ResultSet. И поэтому подумал, что этот подход поможет в производительности. – v1shnu

+1

Сегодня я попробовал ResultSetExtractor и смог сделать то, что я намеревался сделать. Не могли бы вы добавить небольшой фрагмент реализации того, как работает ResultSetExtractor, чтобы ответ был более полезным для других? – v1shnu

Смежные вопросы