Saltar al contenido

Spring Data JPA: clasificación y paginación con tablas unidas

Nuestro team redactor ha pasado mucho tiempo investigando para darle soluciones a tu pregunta, te regalamos la solución por esto nuestro objetivo es serte de gran ayuda.

Solución:

Prueba algo como esto:

Specification joins = (customer, query, cb) ->  
    // from CustomerEntity c
    // join c.items i
    Join items = customer.join("items");

    // join i.documents d
    Join documents = items.join("documents");

    // // where c.customerNumber = ?1 and i.itemNumber = ?2 and d.validDate = ?3 
    return cb.and( 
            customer.equal(customer.get("customerNumber", customerNumber)),
            items.equal(items.get("itemNumber", itemNumber)), 
            documents.equal(documents.get("validDate", validDate))
    );
;

// sort by c.customerNumber asc
PageRequest pageRequest = new PageRequest(0, 2, new Sort(Sort.Direction.ASC, "customerNumber"));

Page customerPage = CustomerRepo.findAll(joins, pageRequest);

Pero no sé por qué necesitas Specification ¿aquí?

Puedes hacer lo mismo más simple:

@Query("select c from CustomerEntity c join c.items i join i.documents d where c.customerNumber = ?1 and i.itemNumber = ?2 and d.validDate = ?3")
Page getCustomers(String customerNumber, String itemNumber, LocaleDate validDate, Pageable pageable);  

Pero todo esto no tiene sentido ya que sus tres entidades tienen asociaciones secuenciales de uno a muchos. En este caso, en lugar de tres condiciones, puede usar solo la última: where d.validDate = ?1. Luego, un método de consulta se volvió aún más fácil:

@Query("select c from CustomerEntity c join c.items i join i.documents d where d.validDate = ?1")
Page getCustomers(LocaleDate validDate, Pageable pageable);

ACTUALIZAR

Para agregar ordenación por un campo de entidad unida podemos usar orderBy metodo de la query:

Specification joins = (customer, query, cb) ->  

    Join items = customer.join("items");
    Join documents = items.join("documents");

    // Ascending order by 'Document.itemNumber'
    query.orderBy(cb.asc(documents.get("itemNumber")));

    return cb.and( 
            customer.equal(customer.get("customerNumber", customerNumber)),
            items.equal(items.get("itemNumber", itemNumber)), 
            documents.equal(documents.get("validDate", validDate))
    );
;

Page customerPage = CustomerRepo.findAll(joins, new PageRequest(0, 2));

Para ordenar por varios parámetros puedes pasarlos al método separados por comas o por un List:

query.orderBy(cb.asc(items.get("customerNumber")), cb.desc(documents.get("itemNumber")));

Más adelante puedes encontrar las explicaciones de otros desarrolladores, tú de igual manera tienes la habilidad insertar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *