múltiples repositorios de paginación

mmc.dev:

Tengo dos classess: A, B. Para cada clase tengo repositorio. Quiero mostrar datos en una tabla (frontend, algo similar a: http://embed.plnkr.co/V06RsBy4a6fShwmZcUEF/ ). Quiero tener la paginación del lado del servidor.

List<Object> result = new ArrayList();
result.addAll(repoA.findAll());
result.addAll(repoB.findAll());

public interface repoAPaginationRepository extends PagingAndSortingRepository<A, Long> {
    Page<A> findAll(Pageable pageRequest);
}

public interface repoAPaginationRepository extends PagingAndSortingRepository<B, Long> {
    Page<B> findAll(Pageable pageRequest);
}

¿Es suficiente para resumir el "contar" de ambos repositorios? Ejemplo: Repositorio A: 100 elementos, el repositorio de B: de 50 elementos. Suma: 150 artículos que quiero mostrar 50 artículos por página.

Motia:

Como usted ha mencionado el recuento será correcta. es necesario encontrar una forma de mostrar los datos combinados correctamente. Podemos ver que los repositorios ordena los registros entre los tipos allí. Pero si concatenar los resultados, no van a ser ordenados.

En su ejemplo, vamos a suponer que repoA.findAll()el retorno [7,8,9]y la repoB.findAll()rentabilidad [1, 100], el resultado [7,8,9,1,100]no será ordenados correctamente. La solución que necesita depende de si el origen de datos (base de datos) soporta un operador UNION o no

El uso de uniones

APP no puede hacer esto (operación de unión) . Pero si su base de datos proporciona un unionoperador (por ejemplo: SQL o MongoDB) que se puede utilizar para obtener los identificadores de los registros de acuerdo a la clase y luego buscar los registros de las identificaciones a través de la APP.

No hay sindicatos

Si su base de datos no proporciona el, al hacer esto, tendrá que crear un tercer depósito, debe cargar 50 artículos de repoAconsiderar una aOffsety 50 artículos de repoBconsiderar una bOffset, a continuación, ordenar la 100 de ellos (que debe ser rápido con el ordenamiento por mezcla y puede dejar el algoritmo a 50).

El código se verá algo como esto

interface RepoA {
  List paginate(int count, int offset, SortCriteria sortCriteria);
}

interface RepoB {
 List paginate(int count, int offset, SortCriteria sortCriteria);
}

class RepoAB {
  private RepoA repoA;
  private repoB repoB;


  List paginate (int count, int offset, SortCriteria sortCriteria) {
     int aOffset = count == 0 ? 0 : calcAOffset(offset, sortCriteria);
     int bOffset = count == 0 ? 0 : offset - aOffset;
     return mergeSort(
             repoA.paginate(count, aOffset),
             repoB.paginate(count, bOffset),
             SortCriteria sortCriteria,
             50
           )
  }

  List mergeSort(List aList, List bList, SortCriteria sortCriteia, int stopAt) {
    ...
  }

  int calcAOffset (int offset, SortCriteria sortCriteria) {
    // This implementation can be very heavy, it will count all the records that
    // that appeared in the previous pages. 
    // You can evade this computation by knowing the offset using the last record 
    // in the previous page.
    return paginate(offset, 0, sortCriteria).filter(x => x instanceOf A).length
  }
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=215410&siteId=1
Recomendado
Clasificación