JPA Сортировка и разбиение на страницы - PullRequest
0 голосов
/ 09 ноября 2018

В моем коде мне нужно монтировать выбор динамически в соответствии с параметризацией моей системы. Для этого я настраиваю следующую структуру:

    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 вставляет, чтобы сделать нумерацию страниц:

выберите сгенерированный

Вот результат моего выбора, уже заказанного, без подкачки, генерируемой JPA

Основной выбор

Здесь результат, полученный с нумерацией страниц. Обратите внимание, что из-за нумерации страниц первые 10 записей не совпадают. Из того, что я понимаю, это происходит потому, что он основан на ROWNUM моего основного запроса и приносит только строки меньше 10.

Результат с нумерацией страниц

У меня вопрос, как JPA-страница правильно отображает результат, учитывая порядок выбора?

1 Ответ

0 голосов
/ 12 ноября 2018

Я понял свою ошибку. В заказе, который я выполняю, я поместил только один столбец, который содержал несколько равных значений. В этих разделах я считаю, что Oracle сам заказал записи в соответствии с возвратом. Чтобы исправить это, я добавил ключевое поле в порядке, и это принесло записи правильно.

...