Uso de Proyecciones en Queries Personalizados con Java y SQL
Clase 19 de 25 • Curso de Java Spring Data JPA: Bases de Datos
Resumen
¿Qué son las projections y cómo funcionan en Java?
Las projections son DTOs (Data Transfer Objects) que nos permiten definir una estructura personalizada para recuperar datos específicos de una base de datos. Son especialmente útiles cuando requerimos construir consultas complejas que no se ajustan completamente a los campos de una sola tabla. Imagina que en un proyecto de una Pixería, necesitas detalles de una orden que involucran varias tablas: el identificador de la orden, la fecha, y el total están en "PixaOrder," pero para el nombre del cliente consultarías la tabla "Customer," y para los nombres de las pizzas usarías la tabla "Pixa." Las projections ofrecen una forma eficiente de manejar estos casos.
¿Cómo crear una proyección?
Para crear una proyección en tu aplicación, debes seguir estos pasos:
- Crear una interfaz: Define una interfaz, por ejemplo,
OrderSummary
, que contenga los métodos con los atributos que deseas recuperar en tu consulta.
public interface OrderSummary {
Integer getIdOrder();
String getCustomerName();
Date getOrderDate();
Double getOrderTotal();
String getPizzaNames();
}
- Escribir la consulta SQL: Redacta un query SQL que recupere los datos necesarios de la base de datos. Usa
JOIN
para unir las tablas relevantes.
SELECT po.id_order AS idOrder,
c.name AS customerName,
po.order_date AS orderDate,
po.total AS orderTotal,
GROUP_CONCAT(p.name) AS pizzaNames
FROM pixa_order po
JOIN customer c ON po.id_customer = c.id_customer
JOIN order_item oi ON po.id_order = oi.id_order
JOIN pixa p ON oi.id_pixa = p.id_pixa
WHERE po.id_order = :orderId
GROUP BY po.id_order, c.name, po.order_date, po.total;
¿Cómo usamos la proyección en el código?
Después de crear la interfaz y la consulta, el siguiente paso es integrarla con el código de la aplicación:
- Definir el repositorio: Crea un método en tu repositorio que retorne el tipo de interfaz
OrderSummary
y anota este método con@Query
.
@Query(value = "SELECT ...", nativeQuery = true)
OrderSummary findSummary(@Param("orderId") Integer orderId);
- Implementar el servicio: Añade un método en tu servicio que use el repositorio para obtener el resumen de la orden.
public OrderSummary getSummary(Integer orderId) {
return orderRepository.findSummary(orderId);
}
- Exponer en el controlador: Finalmente, crea un endpoint en el controlador para responder con esta proyección.
@GetMapping("/orders/summary/{id}")
public OrderSummary getOrderSummary(@PathVariable Integer id) {
return orderService.getSummary(id);
}
¿Cuál es el beneficio de usar projections?
Las projections ofrecen varias ventajas:
- Eficiencia: Se evita cargar entidades enteras con todas sus relaciones, mejorando la performance.
- Claridad: Hacen que el código sea más legible y facilitan la comprensión de lo que se está recuperando.
- Flexibilidad: Proveen una forma simple de definir y alterar estructuras de datos retornadas sin cambiar la lógica del query.
Así que, ¿a qué esperas para implementar esta técnica? Aprovecha las proyecciones para optimizar tus consultas y hacer tu aplicación más eficiente. ¿Quieres más? Continúa perfeccionando tus habilidades en Java y base de datos, existen demasiadas herramientas y tácticas por descubrir.