JPA 排序和分页

Posted

技术标签:

【中文标题】JPA 排序和分页【英文标题】:JPA Sorting and Pagination 【发布时间】:2018-11-09 12:17:09 【问题描述】:

在我的代码中,我需要根据系统的参数化动态挂载选择。为此,我设置了以下结构:

    StringBuilder sql = new StringBuilder();
    final String numeroCadastro = "numeroCadastro";

    sql.append("select colaborador.id.numeroEmpresa, colaborador.id.tipoColaborador, colaborador.id.numeroCadastro as ").append(numeroCadastro).append(", colaborador.nome as nome, ");

    boolean sinalPositivo = false;
    String alias = "horasPagar";
    getSelectSumHorasCompensacao(sql, sinalPositivo, alias);

    sql.append(",");

    sinalPositivo = true;
    alias = "horasReceber";
    getSelectSumHorasCompensacao(sql, sinalPositivo, alias);

    sql.append(" from Colaborador colaborador, Situacao situacao ");

    sql.append(" where ");...

为了挂载排序 sn-p,我将“Order by”直接添加到查询字符串中,并按如下方式设置我的限制器:

 if (StringUtils.isNotBlank(orderByField)) 

        return " order by " + orderByField.replace("x.", aliasName);
     else if (StringUtils.isNotBlank(defaultSort)) 
        return " order by " + aliasName + defaultSort;
    
    .
    .
    .
 EntityManager persistenceContext = getPersistenceContext();

 TypedQuery<T> jpaQuery = persistenceContext.createQuery(sbSql.toString(), T);
 if (start != null && limit != null) 
            jpaQuery.setFirstResult(start);
            jpaQuery.setMaxResults(limit);
        

        List<Object[]> resultList = jpaQuery.getResultList();

但是这样做会设置一个选择命令,该命令通过考虑我的主选择的行号而不考虑它被分页来正确分页。以下是使用 JPA 插入以进行分页的部分生成的命令:

select generated

这是我的选择已经排序的结果,没有JPA生成的分页

Main select

这里是分页生成的结果。请注意,由于分页,前 10 条记录不同。据我了解,这是因为它基于我的主查询的 ROWNUM 并且只带来小于 10 的行。

Result with pagination

我的问题是,JPA 如何根据我的选择顺序正确分页结果?

【问题讨论】:

【参考方案1】:

我意识到我的错误。在我正在执行的排序中,我只放置了一列包含几个相等的值。在这些部分中,我相信 Oracle 本身根据回报对记录进行了排序。为了解决这个问题,我在排序中添加了一个关键字段,这使得记录正确。

【讨论】:

以上是关于JPA 排序和分页的主要内容,如果未能解决你的问题,请参考以下文章

springboot整合mongodb复杂查询和分页查询

EAGER 和分页:Spring MVC + JPA Repository + Hibernate

页面设置中“分页符”和“下一页”的区别是啥?

用SpringBoot+MySql+JPA实现对数据库的增删改查和分页

GridView 排序和分页

使用 gridview asp.net 进行排序和分页