En aquest tema, aprendrem com utilitzar els mètodes de consulta a Spring Data JPA per interactuar amb la base de dades de manera eficient. Els mètodes de consulta ens permeten definir consultes personalitzades sense necessitat d'escriure codi SQL explícitament.
Objectius
- Entendre què són els mètodes de consulta a Spring Data JPA.
- Aprendre a definir mètodes de consulta utilitzant convencions de nomenclatura.
- Utilitzar anotacions per a consultes personalitzades.
- Implementar consultes natives SQL.
- Què són els mètodes de consulta a Spring Data JPA?
Els mètodes de consulta a Spring Data JPA són mètodes definits en els repositoris que permeten realitzar operacions de lectura sobre la base de dades. Aquests mètodes poden ser generats automàticament per Spring Data JPA basant-se en el nom del mètode o poden ser definits utilitzant anotacions.
- Definint mètodes de consulta utilitzant convencions de nomenclatura
Spring Data JPA pot generar automàticament consultes basant-se en el nom del mètode. Aquestes convencions de nomenclatura permeten crear consultes complexes de manera senzilla.
Exemples de convencions de nomenclatura
public interface UserRepository extends JpaRepository<User, Long> { // Troba un usuari per nom User findByName(String name); // Troba tots els usuaris per edat List<User> findByAge(int age); // Troba usuaris per nom i edat List<User> findByNameAndAge(String name, int age); // Troba usuaris amb edat major que un valor donat List<User> findByAgeGreaterThan(int age); }
Explicació dels exemples
findByName(String name)
: Troba un usuari amb el nom especificat.findByAge(int age)
: Troba tots els usuaris amb l'edat especificada.findByNameAndAge(String name, int age)
: Troba usuaris amb el nom i l'edat especificats.findByAgeGreaterThan(int age)
: Troba usuaris amb una edat superior a la especificada.
- Utilitzant anotacions per a consultes personalitzades
Quan les convencions de nomenclatura no són suficients, podem utilitzar anotacions per definir consultes personalitzades.
Exemple d'ús de l'anotació @Query
public interface UserRepository extends JpaRepository<User, Long> { // Consulta personalitzada utilitzant JPQL @Query("SELECT u FROM User u WHERE u.email = ?1") User findByEmail(String email); // Consulta personalitzada amb paràmetres amb nom @Query("SELECT u FROM User u WHERE u.name = :name AND u.age = :age") List<User> findByNameAndAge(@Param("name") String name, @Param("age") int age); }
Explicació dels exemples
@Query("SELECT u FROM User u WHERE u.email = ?1")
: Defineix una consulta JPQL per trobar un usuari per correu electrònic.@Query("SELECT u FROM User u WHERE u.name = :name AND u.age = :age")
: Defineix una consulta JPQL amb paràmetres amb nom per trobar usuaris per nom i edat.
- Implementant consultes natives SQL
En alguns casos, pot ser necessari utilitzar consultes SQL natives. Spring Data JPA permet definir aquestes consultes utilitzant l'anotació @Query
amb l'atribut nativeQuery
.
Exemple de consulta nativa
public interface UserRepository extends JpaRepository<User, Long> { // Consulta nativa SQL @Query(value = "SELECT * FROM users WHERE email = ?1", nativeQuery = true) User findByEmailNative(String email); }
Explicació de l'exemple
@Query(value = "SELECT * FROM users WHERE email = ?1", nativeQuery = true)
: Defineix una consulta SQL nativa per trobar un usuari per correu electrònic.
Exercicis pràctics
Exercici 1: Definir mètodes de consulta utilitzant convencions de nomenclatura
- Crea un repositori per a una entitat
Product
amb els següents mètodes de consulta:findByName(String name)
: Troba un producte pel seu nom.findByPriceLessThan(double price)
: Troba productes amb un preu inferior al especificat.findByCategoryAndPriceGreaterThan(String category, double price)
: Troba productes per categoria i amb un preu superior al especificat.
Exercici 2: Definir consultes personalitzades amb @Query
- Afegeix els següents mètodes de consulta personalitzada al repositori
ProductRepository
:@Query("SELECT p FROM Product p WHERE p.name = ?1")
: Troba un producte pel seu nom.@Query("SELECT p FROM Product p WHERE p.category = :category AND p.price < :price")
: Troba productes per categoria i amb un preu inferior al especificat.
Solucions
Solució Exercici 1
public interface ProductRepository extends JpaRepository<Product, Long> { Product findByName(String name); List<Product> findByPriceLessThan(double price); List<Product> findByCategoryAndPriceGreaterThan(String category, double price); }
Solució Exercici 2
public interface ProductRepository extends JpaRepository<Product, Long> { @Query("SELECT p FROM Product p WHERE p.name = ?1") Product findByName(String name); @Query("SELECT p FROM Product p WHERE p.category = :category AND p.price < :price") List<Product> findByCategoryAndPriceLessThan(@Param("category") String category, @Param("price") double price); }
Conclusió
En aquest tema, hem après com utilitzar els mètodes de consulta a Spring Data JPA per interactuar amb la base de dades. Hem vist com definir mètodes de consulta utilitzant convencions de nomenclatura, com utilitzar anotacions per a consultes personalitzades i com implementar consultes natives SQL. Aquests coneixements ens permetran crear aplicacions més eficients i flexibles.
Curs de Spring Boot
Mòdul 1: Introducció a Spring Boot
- Què és Spring Boot?
- Configuració del teu entorn de desenvolupament
- Creant la teva primera aplicació Spring Boot
- Entenent l'estructura del projecte Spring Boot
Mòdul 2: Conceptes bàsics de Spring Boot
- Anotacions de Spring Boot
- Injecció de dependències a Spring Boot
- Configuració de Spring Boot
- Propietats de Spring Boot
Mòdul 3: Construint serveis web RESTful
- Introducció als serveis web RESTful
- Creant controladors REST
- Gestionant mètodes HTTP
- Gestió d'excepcions en REST
Mòdul 4: Accés a dades amb Spring Boot
- Introducció a Spring Data JPA
- Configuració de fonts de dades
- Creant entitats JPA
- Utilitzant repositoris de Spring Data
- Mètodes de consulta a Spring Data JPA
Mòdul 5: Seguretat a Spring Boot
- Introducció a Spring Security
- Configuració de Spring Security
- Autenticació i autorització d'usuaris
- Implementant autenticació JWT
Mòdul 6: Proves a Spring Boot
Mòdul 7: Funcions avançades de Spring Boot
Mòdul 8: Desplegant aplicacions Spring Boot
Mòdul 9: Rendiment i monitorització
- Optimització del rendiment
- Monitorització amb Spring Boot Actuator
- Utilitzant Prometheus i Grafana
- Gestió de registres i logs