JPA排序和分页

时间:2018-11-09 12:17:09

标签: sorting jpa pagination

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

    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 ");...

要安装排序代码段,我将“ 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 个答案:

答案 0 :(得分:0)

我意识到自己的错误。在执行的顺序中,我仅放置了包含几个相等值的一列。在这些部分中,我相信Oracle本身会根据退货对记录进行排序。为了解决这个问题,我在排序中添加了一个关键字段,这正确地带来了记录。