0Pricing
Java Academy · Lekcja

Repozytoria Spring Data i metody zapytań

Proszę rozszerzać JpaRepository, definiować metody zapytań zgodnie z konwencją nazewniczą i używać @Query do niestandardowego JPQL.

Repozytoria Spring Data i metody zapytań to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.

Repozytoria Spring Data JPA

Rozszerzenie JpaRepository<Entity, ID> zapewnia bez dodatkowego kodu metody CRUD, stronicowanie i sortowanie. Spring generuje implementację podczas uruchamiania — nie trzeba pisać SQL ani szablonowego kodu DAO.

public interface UserRepository extends JpaRepository<User, Long> {
    // Free: findAll, findById, save, delete, count, existsById, etc.
}

Metody zapytań na podstawie nazw

Spring Data generuje zapytania na podstawie nazw metod. Konwencja nazewnicza jest następująca: findBy + właściwość + opcjonalne warunki.

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByStatus(UserStatus status);
    Optional<User> findByEmail(String email);
    List<User> findByAgeGreaterThanAndStatusOrderByNameAsc(int age, UserStatus s);
    boolean existsByEmail(String email);
    long countByStatus(UserStatus status);
}

Obsługiwane słowa kluczowe w nazwach metod

Najważniejsze słowa kluczowe w nazwach to: And, Or, Is/Equals, Between, LessThan/GreaterThan, Like/NotLike, In/NotIn, IsNull/IsNotNull, OrderBy, First/Top.

List<User> findTop5ByStatusOrderByCreatedAtDesc(UserStatus s);
List<User> findByNameContainingIgnoreCase(String fragment);
List<User> findByCreatedAtBetween(LocalDateTime from, LocalDateTime to);

@Query dla niestandardowego JPQL

Adnotacji @Query należy używać w przypadku złożonych zapytań, których nie można wyrazić za pomocą nazw metod. JPQL używa nazw klas encji i pól, a nie nazw tabel i kolumn.

@Query("SELECT u FROM User u WHERE u.email = :email AND u.status = :status")
Optional<User> findActiveByEmail(@Param("email") String email,
                                @Param("status") UserStatus status);

@Query("SELECT u.name, COUNT(o) FROM User u JOIN u.orders o GROUP BY u.name")
List<Object[]> countOrdersPerUser();

Zapytania natywne

Parametr nativeQuery = true umożliwia pisanie bezpośrednich zapytań SQL. Jest to przydatne w przypadku funkcji specyficznych dla bazy danych, takich jak ON CONFLICT, funkcje okna lub wyszukiwanie pełnotekstowe.

@Query(value = "SELECT * FROM users WHERE tsv @@ plainto_tsquery(:q)",
       nativeQuery = true)
List<User> fullTextSearch(@Param("q") String query);

Modyfikowanie zapytań za pomocą @Modifying

Zapytania aktualizujące i usuwające należy opatrzyć adnotacją @Modifying. Należy dodać @Transactional, ponieważ zapytania modyfikujące wymagają aktywnej transakcji.

@Modifying
@Transactional
@Query("UPDATE User u SET u.status = :s WHERE u.lastLogin < :cutoff")
int deactivateInactiveUsers(@Param("s") UserStatus s,
                             @Param("cutoff") LocalDateTime cutoff);

Metody usuwania na podstawie nazw

Spring Data generuje również zapytania usuwające na podstawie nazw metod — jest to wygodne w przypadku operacji porządkowych.

void deleteByStatus(UserStatus status);
long deleteByCreatedAtBefore(LocalDateTime cutoff);

Warianty repozytoriów: CrudRepository, PagingAndSortingRepository

Jeśli nie są potrzebne wszystkie metody JpaRepository, należy użyć węższych interfejsów bazowych. CrudRepository udostępnia podstawowe operacje CRUD, a PagingAndSortingRepository dodaje findAll(Pageable).

public interface ReadOnlyUserRepository extends PagingAndSortingRepository<User, Long> {
    // Only paging + sorting — no save/delete
}

@EntityGraph — optymalizacja pobierania

Adnotacja @EntityGraph pozwala zastąpić domyślną strategię pobierania dla konkretnego zapytania i ładować powiązania w trybie eager bez zmiany mapowania encji.

@EntityGraph(attributePaths = {"orders", "orders.items"})
@Query("SELECT u FROM User u WHERE u.id = :id")
Optional<User> findWithOrders(@Param("id") Long id);

Niestandardowe implementacje repozytoriów

Niestandardową metodę można dodać, tworząc interfejs i klasę implementacji zgodnie z konwencją nazewniczą UserRepositoryCustom + UserRepositoryCustomImpl. Spring łączy je ze sobą.

public interface UserRepositoryCustom {
    List<User> searchByCriteria(UserSearchCriteria criteria);
}
public class UserRepositoryCustomImpl implements UserRepositoryCustom {
    @PersistenceContext EntityManager em;
    public List<User> searchByCriteria(UserSearchCriteria c) {
        // use Criteria API or JdbcTemplate
    }
}
public interface UserRepository extends JpaRepository<User,Long>, UserRepositoryCustom {}

Szybkie sprawdzenie

Jaka adnotacja jest wymagana wraz z @Query w przypadku instrukcji UPDATE/DELETE?

Podsumowanie

Rozszerz JpaRepository, aby bez dodatkowego kodu uzyskać operacje CRUD. W przypadku prostych zapytań używaj nazw metod zgodnych z konwencją. Do złożonego JPQL lub natywnego SQL używaj @Query. W przypadku aktualizacji stosuj @Modifying+@Transactional. Do dostrajania pobierania używaj @EntityGraph.

Często zadawane pytania

Czy lekcja „Repozytoria Spring Data i metody zapytań” jest bezpłatna?

Tak — pełny tekst „Repozytoria Spring Data i metody zapytań” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Repozytoria Spring Data i metody zapytań”?

Proszę rozszerzać JpaRepository, definiować metody zapytań zgodnie z konwencją nazewniczą i używać @Query do niestandardowego JPQL. Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Java Academy?

Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Repozytoria Spring Data i metody zapytań”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?

Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Mapowanie encji za pomocą adnotacji JPA
  2. Repozytoria Spring Data i metody zapytań
  3. Relacje jeden-do-wielu i wiele-do-wielu
  4. Paginacja, sortowanie i projekcje
← Powrót do Java Academy