Что делают гениальные "энтерпрайзнутые" Java EE горе-девелоперы:
0. Кто-то не очень гениальный догадался хранить последнюю версию объекта и его истории в одной и той же таблице: id, version, submit_date, description, some_data (CLOB). Да, для отображения списка CLOB не используется.
При такой структуре они постоянно вынуждены искать max(version) и потом выбирать данные последней версии.
1. Выбираем список всех PK для последней версии:
select max(submit_date) submit_date, id, max(version) version from obj_table
group by id
order by submit_date desc;
!!! список отсортированный!!!
2. Создаем объект TreeMap - сортирует элементы по ключу по мере добавления их к Map. И!!! результат запроса запихиваем туда создавая ключ как submit_date.toString() + id.toString()
ыыы... т.е. сортировка в п.1 нам не понравилась.
3. Из TreeMap дергаем только значения (отсортированные) в ArrayList
4. Получившийся ArrayList реверсируем :) Collections.reverse :) Ну не понравился нам порядок.
5. Для всего найденного массива PK начинаем дергать объекты из базы. Ага - все таже табличка и нам для списка нужены только поля таблицы. Тем не менее для каждого PK на текущей странице дергаем БД и создаем ValueObject. Потом для этого объекта дергаем все его версии, для каждой версии создаем объект и пихаем его к головной версии в список.
Внимание - some_data, кт. большой CLOB мы считываем и пихаем в память к объектам.
6. Получившийся список объектов скармливаем процедуре, кт. создает другой список таких же объектов, но не копируем some_data.
7. Только теперь анализируем какую страницу из всего списка объектов мы выводим на экран и формируем массив из объектов этой страницы.
7. Только теперь анализируем какую страницу из всего списка объектов мы выводим на экран и формируем массив из объектов этой страницы.
8. Наконец, новый список объектов скармливаем JAXB для получения большого XML.
9. Получившийся XML скармливаем XSL и получаем страницу HTML кт. уже возвращаем клиенту.
На каждый переход между страницами повторяем с п.1
P.S. Еще молчу о бесконечной вложенности вызовов методов, содержимое кт. содержит вызов другого метода с небольшой модификацией параметров.