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.