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
- Mapowanie encji za pomocą adnotacji JPA
- Repozytoria Spring Data i metody zapytań
- Relacje jeden-do-wielu i wiele-do-wielu
- Paginacja, sortowanie i projekcje