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.

  1. 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.

  1. 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.

  1. 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.

  1. 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

  1. 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

  1. 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

Mòdul 2: Conceptes bàsics de Spring Boot

Mòdul 3: Construint serveis web RESTful

Mòdul 4: Accés a dades amb Spring Boot

Mòdul 5: Seguretat a Spring Boot

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ó

Mòdul 10: Millors pràctiques i consells

© Copyright 2024. Tots els drets reservats