Spring batch - Использование разбивки на mybatis при объединении - PullRequest
0 голосов
/ 20 сентября 2018

Есть ли лучший способ справиться с разбиением на страницы mybatis при использовании запроса union?Не рассматривайте это как сильный пример использования, а просто представляю мою актуальную проблему.

Мне нужно сделать объединение, чтобы получить записи из 2 разных таблиц.

Здесь проблема в том, что если я установлю размер страницы, например, 100, если у 10 учеников по 20 записей в каждой, тогда я получу только 100 записей, даже если есть 200 записей.И в приведенном ниже примере класса, когда я распечатаю количество записей, которое есть у каждого учащегося, я не увижу все записи.

Например -

<code>
with student AS (
select * from std (
 select studentId, name, class, ROW_NUMBER() over (order by studentId) as paginationRank from Student
)std
where paginationRank > #{ _skipRows} and paginationRank <= ( #{_pageSize} * 
(#{_page}+1))
)

select student.studentId, attendanceRegfields......Creditsfields....
from student left outer join 
( select ..... from attendanceReg
   union all 
  select  .... from Credits ) all_records
on all_records.studentId = student.studentId
</code>

В моем элементе записи, если яполучить все студенческие записи

<code>
  class MyItemWriter extends ItemWriter<Student>
    {

        write(List<student> studentRecords){
             Map<String, List<Student>> studentRecordsMap = 
        studentRecords.stream().collect(groupby(e-> e.getStudentId()));
      studentRecordsMap .forEach((key, studentRecords) -> process(stuedntRecords);

    }

process(List<Student> studentRecords){
// here I am processing all records
}
    }
</code>

1 Ответ

0 голосов
/ 20 сентября 2018

Каждая запись результата вашего запроса должна представлять элемент (Student в вашем случае).Ваш читатель должен иметь возможность вернуть полный элемент ученика со всеми его дочерними записями (очевидно, Credit записей из вашего запроса).В противном случае нумерация страниц не даст правильных результатов по очевидным причинам.

В вашем случае вам понадобится Шаблон запроса на вождение : читатель может читать только студентов (без дочерних записей), а затемПроцессор будет заполнять каждого учащегося дочерними записями (в основном результат запроса объединения для текущего элемента).При таком подходе разбиение на страницы будет работать только для студентов, независимо от того, сколько дочерних записей имеет каждый элемент.

Надеюсь, это поможет.

...