【问题标题】:Pageable in spring for paging on List<Object> is not working春季可分页用于 List<Object> 上的分页不起作用
【发布时间】:2020-10-10 14:42:07
【问题描述】:

我有一个包含 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

我在哪里出错了? 如果我尝试添加可分页对象来查询和运行代码,我将收到以下错误:

无法使用请求的结果类型 [java.lang.Long] 为具有多个返回的查询创建 TypedQuery;嵌套异常是 java.lang.IllegalArgumentException:无法使用请求的结果类型 [java.lang.Long] 为具有多个返回的查询创建 TypedQuery

【问题讨论】:

  • 你能显示你的存储库方法getapplication_adminview 吗?
  • @Eklavya 已更新 ...如果我尝试将 pagable 添加到存储库方法,则会给出错误,即它是 typedquery..
  • 如果不使用分页,您的数据是否正确获取?您是否收到任何错误,请附上它们。
  • 请附上您在存储库方法中添加分页时遇到的错误
  • @Eklavya 看到我之前尝试过使用 pageable ,我们所做的基本工作是获取结果并使用 findall() 方法添加 Pageable ......但是这里的查询是从许多人那里获取结果列..这里它不起作用...

标签: spring-boot jpa pageable


【解决方案1】:

Page 只代表一页数据。所以page.getContent() 只返回创建此页面实例时通过构造函数指定的一页中的所有数据。它与拆分页面中的数据无关。

如果要拆分列表,使用Guava 中的Lists 是最简单的方法:

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

如果要进行分页,将存储在数据库中的所有数据拆分为不同的较小页面,请在数据库级别进行拆分,而不是将整个列表放到内存中进行拆分,当整个列表被拆分时,这将非常低效大。请参阅this,了解如何通过在查询方法中声明Pageable,在数据库级别对其进行拆分。

【讨论】:

  • 兄弟,请告诉我如何将 10000 行分成 10 个块,页码为 0。因为它是一个类型化查询,提供了太多字段,我尝试过使用 pageable,但它不是工作..在这种情况下......因为我正在从不同的表中获取字段并评估它们
  • 看来你的查询是原生sql,所以尝试在@Query中添加nativeQuery= true,同时定义countQuery,在@Query方法中添加Pageable跨度>
  • 你是对的,但我不想更新存储库中的方法,所以我采取了另一种方法..我会分享同样的..非常感谢
  • 非常感谢您分享知识...值得赞赏
【解决方案2】:

我们可以使用 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
      

【讨论】:

    【解决方案3】:

    以下教程帮助了我 -> https://www.baeldung.com/spring-data-jpa-query

    此时 4.3. Spring Data JPA 2.0.4 之前的版本

    添加\ n-- #pageable \ n非常重要

    没有这个我错了

    另外分页设置必须是无序的

    PageRequest paginaConf = new PageRequest ((param1 - 1)
                                                     , param2);
    

    终于要转换Page

      Page <Object []> list = myQueryofRepo ();
             List <XXXModel> lstReturn = myConversor (list.getContent ());
             Page <XXXModel> ret = new PageImpl <XXXModel> (lstReturn, pageConf, param2);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      相关资源
      最近更新 更多