Construir consultas personalizadas en Spring Data sin escribir SQL manualmente es posible gracias a los query methods. Esta funcionalidad permite generar sentencias SQL a partir del nombre de los métodos definidos en los repositorios, lo que simplifica enormemente el acceso a datos y mantiene el código limpio y legible.
¿Cómo funcionan los query methods en Spring Data?
Cuando los repositorios por defecto no cubren una necesidad específica de consulta, los query methods son la alternativa ideal. Su funcionamiento se basa en una convención de nombres: Spring Data interpreta el nombre del método y lo convierte automáticamente a SQL en tiempo de ejecución [01:00].
Por ejemplo, si necesitamos obtener todas las pizzas disponibles en una pizzería, el SQL equivalente sería:
sql
SELECT * FROM pizza WHERE available = 1 ORDER BY price;
Con un query method, esto se traduce en un método cuyo nombre describe exactamente la consulta deseada, sin necesidad de escribir SQL de forma manual.
¿Cómo crear un query method con keywords como true y order by?
Dentro de PizzaRepository, el primer query method se define así [02:07]:
java
List<PizzaEntity> findAllByAvailableTrueOrderByPrice();
- findAllBy: indica que se buscarán todos los registros.
- AvailableTrue: filtra automáticamente donde la columna
available sea verdadera, sin necesidad de recibir un parámetro.
- OrderByPrice: ordena los resultados por precio de forma ascendente.
En el PizzaService se crea el método correspondiente:
java
public List<PizzaEntity> getAvailable() {
return this.pizzaRepository.findAllByAvailableTrueOrderByPrice();
}
Y en el PizzaController, se expone a través de un endpoint GET que invoca getAvailable() del servicio [03:03]. Al ejecutar la petición desde Postman, se obtienen todas las pizzas disponibles. En consola se puede verificar cómo Spring convirtió el nombre del método a un SELECT con WHERE available y ORDER BY price ASC [03:40].
¿Cómo combinar condiciones con and e ignore case?
El segundo query method busca una pizza por nombre, pero solo entre las disponibles [04:10]:
java
PizzaEntity findAllByAvailableTrueAndNameIgnoreCase(String name);
Aquí se combinan varias keywords importantes:
- And: permite agregar una segunda condición a la consulta.
- NameIgnoreCase: compara el nombre sin distinguir entre mayúsculas y minúsculas.
Este método sí recibe un parámetro (String name), ya que el valor de available queda fijo como true dentro del propio nombre del método, pero el nombre de la pizza se determina dinámicamente.
En el servicio se implementa de esta forma:
java
public PizzaEntity getByName(String name) {
return this.pizzaRepository.findAllByAvailableTrueAndNameIgnoreCase(name);
}
Desde el controlador, se recibe el nombre como path variable [05:20]. Es importante recordar que cuando ya existe otro método con un solo parámetro en el controlador, se debe diferenciar la ruta para que Spring identifique correctamente qué método ejecutar.
¿Qué SQL genera Spring con ignore case?
Al probar con el nombre "popeye" escrito en minúsculas [05:53], la respuesta devuelve correctamente la pizza correspondiente. En consola, el SQL generado revela el mecanismo: Spring aplica la función UPPER() tanto al valor almacenado en la base de datos como al parámetro enviado, garantizando una comparación sin distinción de mayúsculas o minúsculas [06:13].
sql
SELECT * FROM pizza WHERE available AND UPPER(name) = UPPER(?);
Esto sucede gracias a la keyword IgnoreCase incluida en el nombre del método.
¿Qué keywords están disponibles para query methods?
Las keywords utilizadas en estos ejemplos cubren los casos más comunes:
- findAllBy: recupera múltiples registros.
- True / False: fija valores booleanos sin parámetros.
- And / Or: combina múltiples condiciones.
- IgnoreCase: comparación insensible a mayúsculas y minúsculas.
- OrderBy: define el criterio de ordenamiento.
No importa que el nombre del método resulte extenso; lo fundamental es que cumpla su objetivo y sea descriptivo [02:50]. Spring se encarga de traducir esa convención de nombres a SQL optimizado durante la ejecución.
¿Has utilizado query methods con otras keywords en tus proyectos? Comparte tu experiencia en los comentarios.