Contenido del curso

Spring Data Repositories

Fechas y listas en query methods de JPA

Resumen

Cuando trabajas con Spring Data JPA, los query methods te permiten construir consultas complejas sin escribir una sola línea de SQL. Aquí aprenderás a filtrar registros por fechas, comparar valores dentro de listas y contar resultados aprovechando la convención de nombres de los repositorios.

¿Cómo filtrar registros por fecha con query methods?

Las fechas son uno de los filtros más comunes en cualquier aplicación. Spring Data JPA resuelve esto con palabras clave como After y Before que se acoplan al nombre del atributo en tu entidad.

¿Cómo recuperar las órdenes del día actual?

El ejemplo parte de una pizzería que necesita saber qué órdenes han entrado hoy. En el OrderRepository se define el método siguiendo la convención del nombre del campo date de OrderEntity.

java List<OrderEntity> findAllByDateAfter(LocalDateTime date);

La magia está en Date.after. Al pasarle un LocalDateTime, el método traduce automáticamente a un WHERE date > ? en SQL [02:10]. Si necesitas lo contrario, basta con cambiar a Before.

En la capa de servicio, se construye la fecha de referencia tomando el día actual a las 00:00 horas:

java public List<OrderEntity> getTodayOrders() { LocalDateTime today = LocalDate.now().atTime(0, 0); return this.orderRepository.findAllByDateAfter(today); }

El método LocalDate.now().atTime(0,0) te da el corte exacto a medianoche, asegurando que cualquier orden registrada después de esa hora aparezca en el resultado.

¿Qué hace el keyword After en un query method? Genera una cláusula WHERE campo > valor en SQL. Lo usas cuando quieres traer registros posteriores a una fecha o valor numérico.

¿Cómo consultar valores dentro de una lista usando IN?

El segundo escenario que resuelve la clase es traer las órdenes que salen del local: domicilios y pedidos para llevar. Aquí entra el keyword IN, que evalúa si un atributo coincide con cualquier valor de una lista.

¿Cómo se escribe un query method con IN?

En OrderRepository defines el método recibiendo una lista de strings:

java List<OrderEntity> findAllByMethodIn(List<String> methods);

El atributo method en OrderEntity guarda una sola letra que representa el tipo de pedido. Para que el código sea más legible, se declaran constantes en el servicio:

  • DELIVERY = "D" para pedidos a domicilio.
  • CARRYOUT = "C" para pedidos para llevar.
  • ONSITE = "S" para consumo en el local.

Luego se arma la lista con Arrays.asList(DELIVERY, CARRYOUT) y se pasa al repositorio:

java public List<OrderEntity> getOutsideOrders() { List<String> methods = Arrays.asList(DELIVERY, CARRYOUT); return this.orderRepository.findAllByMethodIn(methods); }

En consola verás que Hibernate traduce esto a un WHERE method IN (?, ?), mandando los parámetros agrupados en lugar de hacer comparaciones individuales [05:30].

¿Cuándo conviene usar IN en lugar de múltiples OR? Cuando tienes 2 o más valores posibles para un mismo campo. IN es más limpio, escalable y deja el código preparado para agregar más opciones sin romper la query.

¿Cómo contar registros con query methods en Spring Data?

Los query methods no solo recuperan listas. También puedes ejecutar conteos directamente desde la convención del nombre, sin tocar SQL.

¿Qué diferencia hay entre findAllBy y countBy?

Mientras findAllBy devuelve una colección de entidades, countBy devuelve un entero con la cantidad de registros que cumplen la condición. La sintaxis acepta tanto countBy como countAllBy.

En el ejemplo, queremos saber cuántas pizzas veganas ofrece la pizzería:

java int countByVeganTrue();

Esto se traduce en un SELECT COUNT(*) FROM pizzas WHERE vegan = true. Al ejecutarlo dentro de PizzaService, el resultado fue 2 pizzas veganas disponibles en toda la carta [08:45].

Lo interesante es que el método combina dos elementos: Vegan como nombre del atributo y True como valor literal a comparar. No necesitas pasar parámetros porque el valor ya está implícito en el nombre.

Conceptos y habilidades clave que se aplican

Durante la clase pones en práctica varias técnicas que vale la pena tener identificadas:

  • Convención de nombres en Spring Data JPA: la base que permite generar SQL desde el nombre del método [01:20].
  • LocalDate y LocalDateTime: clases de Java 8+ para manejar fechas sin acoplarte a la zona horaria del sistema [02:30].
  • Keyword After y Before: comparadores temporales o numéricos dentro de query methods.
  • Keyword IN: filtro por coincidencia con cualquier elemento de una lista [04:15].
  • Arrays.asList: utilidad para crear listas inmutables de forma rápida.
  • Constantes con private static final: práctica que mejora la legibilidad y evita strings mágicos en el código [05:00].
  • countBy y countAllBy: variantes para contar registros sin recuperar las entidades completas [07:50].

¿Qué query method te gustaría implementar en tu proyecto actual? Comenta cómo aplicarías estas técnicas en tu propio dominio.