Пейджинг весной для разбиения по списку <Object>не работает - PullRequest
0 голосов
/ 20 июня 2020

У меня есть список объектов, которые содержат 10000 записей, я пытаюсь разбить эти записи на каждую из 10,

Но почему-то это не работает ... может кто-нибудь взглянуть

@Query("select a.applicantid,coalesce(to_char(a.createdon,'yyyy-MM-dd'),to_char(filing_date,'yyyy-MM-dd')) as dt1, \r\n" + 
        "coalesce(c.companyname,i.InstituteName,(u.firstname||' '||u.lastname),\r\n" + 
        "u.firstname) ,a.c_denomination,cc.crop_common_name,cs.crop_botanical_name,\r\n" + 
        "a.id,aps.status,a.cropid, \r\n" + 
        "(select mv.varietytype from VarietyType mv where mv.id= a.varirtytypeid),\r\n" + 
        "(select sv.subvarietytype from SubVarietyType sv,VarietyType mvr \r\n" + 
        " where a.subvarietytypeid = sv.id and mvr.id= sv.varietyid),a.formtype,mcg.crop_group \r\n" + 
        " from Applications a left join ApplicantRegistration ap on \r\n" + 
        " a.applicantid = ap.id left join CompanyRegistration c on ap.companyid = c.id \r\n" + 
        " left join InstitutionRegistration i on ap.institutionid = i.id \r\n" + 
        " left join Crops cc on a.cropid = cc.id left join CropSpecies cs \r\n" + 
        " on a.cropspeciesid =cs.id left join InternalUser u on ap.id = u.applicantid \r\n" + 
        " left join ApplicationStatus aps on a.application_current_status = aps.id "
        + "left join CropGroup mcg on cc.cropgroupid = mcg.id order by a.id desc")
       List<Object[]> getapplication_adminview();



List<Object[]> admin_viewapplication=applicationrepository.getapplication_adminview();
int pageNumber = 0;
int size = 10;
Pageable pageable = PageRequest.of(pageNumber, size); // object of pageable
Page<Object> pages = new PageImpl(admin_viewapplication, pageable, admin_viewapplication.size());
List<Object> lpage = pages.getContent(); // here i am getting the lpage size as 10000 but as i enter pageable as of size 10  i am expecting 10 results only

где я ошибаюсь в этом? если я пытаюсь добавить разбиваемый на страницы объект для запроса и запуска кода, я получу следующую ошибку:

Невозможно создать TypedQuery для запроса с более чем одним возвратом с использованием запрошенного типа результата [java .lang.Long]; вложенное исключение: java .lang.IllegalArgumentException: невозможно создать TypedQuery для запроса с более чем одним возвратом с использованием запрошенного типа результата [java .lang.Long]

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Page просто представляет одну страницу данных. Таким образом, page.getContent() возвращает все данные только на одной странице, которая указывается через конструктор при создании этого экземпляра страницы. Это не имеет ничего общего с разделением данных на странице.

Если вы хотите разделить список, используйте Lists из Guava - это самый простой способ go:

List<List<Object>> splittedList = Lists.partition(list, 10);

Если вы хотите выполнить разбиение на страницы, при котором все данные, хранящиеся в базе данных, разбиваются на разные более мелкие страницы, разделите их на уровне базы данных, а не переносите весь список в память для разделения, что будет очень неэффективно, когда весь список большой. См. this , чтобы узнать, как разделить его на уровне базы данных, объявив Pageable в методе запроса.

0 голосов
/ 20 июня 2020

Мы можем использовать PagedListHolder , который может изменять список на страницах, и затем мы можем получить страницу, установив ее размер и страницу.

PagedListHolder<Object> page = new PagedListHolder(admin_viewapplicationpage);
      page.setPageSize(50); // number of items per page
      page.setPage(0);      // set to first page

      int totalPages = page.getPageCount(); //  gives the totalpages according to the main list
      
      List<Object> admin_viewapplication = page.getPageList();  // a List which represents the current page which is the sublist
      
...