Pochodne metody zapytań i rozpoznawanie słów kluczowych
Buduj złożone zapytania repozytoriów wyłącznie na podstawie nazw metod, korzystając z gramatyki właściwości i słów kluczowych Spring Data.
Pochodne metody zapytań i rozpoznawanie słów kluczowych to bezpłatna lekcja Spring Boot 4 Complete Guide na CoddyKit. To lekcja 1 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 Spring Boot 4 Complete Guide, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Spring Boot 4 Complete Guide zawiera 4 lekcji w sumie.
Części tej lekcji nie zostały jeszcze przetłumaczone i są wyświetlane po angielsku.
What Are Derived Query Methods?
Spring Data JPA can generate a full SQL query just by reading the name of a repository method. You write the method signature, leave the body to the framework, and Spring parses the name into a query at startup.
- No
@Queryannotation needed - No hand-written JPQL or SQL
- The method name is the query specification
This is called a derived query method, because the query is derived from the method name.
public interface UserRepository extends JpaRepository<User, Long> {
// Spring derives: SELECT u FROM User u WHERE u.email = ?1
User findByEmail(String email);
}The Subject and the Predicate
Every derived method name splits into two parts:
- The subject (an introducer like
findBy,readBy,queryBy,getBy) which tells Spring what action to perform. - The predicate (everything after
By) which becomes the WHERE clause.
In findByLastName, find is the subject and LastName is the predicate that maps to the lastName entity property.
public interface CustomerRepository extends JpaRepository<Customer, Long> {
List<Customer> findByLastName(String lastName);
List<Customer> readByCity(String city); // 'readBy' works too
Customer getById(Long id); // 'getBy' works too
}Combining Conditions with And / Or
You chain multiple properties using the keywords And and Or. Each property name in the chain must match an entity field, and the method parameters are bound left-to-right in the same order they appear.
findByFirstNameAndLastName→WHERE first_name = ?1 AND last_name = ?2findByCityOrCountry→WHERE city = ?1 OR country = ?2
public interface CustomerRepository extends JpaRepository<Customer, Long> {
List<Customer> findByFirstNameAndLastName(String firstName, String lastName);
List<Customer> findByCityOrCountry(String city, String country);
}Comparison Keywords
Beyond equality, Spring Data understands a rich set of comparison keywords appended after the property name:
LessThan,LessThanEqual,GreaterThan,GreaterThanEqualBetween— needs two parametersBefore,After— handy for dates
The keyword binds to the property right before it, so findByAgeGreaterThan targets the age property.
public interface ProductRepository extends JpaRepository<Product, Long> {
List<Product> findByPriceLessThan(BigDecimal max);
List<Product> findByPriceBetween(BigDecimal low, BigDecimal high);
List<Product> findByCreatedAtAfter(LocalDateTime since);
}Null, True, and Boolean Keywords
Some keywords take no parameter at all because the condition is baked into the name:
IsNull/IsNotNull→IS NULL/IS NOT NULLTrue/False→ compares a boolean property totrue/false
Notice that findByActiveTrue() has an empty parameter list — the value is fixed by the keyword.
public interface AccountRepository extends JpaRepository<Account, Long> {
List<Account> findByDeletedAtIsNull();
List<Account> findByActiveTrue();
List<Account> findByActiveFalse();
}String Matching Keywords
For text columns, Spring Data offers keywords that translate into LIKE patterns:
Like— you supply the wildcards (%) yourselfStartingWith— appends%automaticallyEndingWith— prepends%Containing— wraps the value in%value%IgnoreCase— makes the comparison case-insensitive
public interface CustomerRepository extends JpaRepository<Customer, Long> {
List<Customer> findByEmailContaining(String fragment);
List<Customer> findByLastNameStartingWith(String prefix);
List<Customer> findByLastNameIgnoreCase(String lastName);
}Ordering Results with OrderBy
You can embed sorting directly in the method name using OrderBy followed by the property and a direction (Asc or Desc). It goes at the very end of the predicate.
findByLastNameOrderByFirstNameAscfindByActiveTrueOrderByCreatedAtDesc
For dynamic sorting at call time, prefer passing a Sort parameter instead of hard-coding it in the name.
public interface CustomerRepository extends JpaRepository<Customer, Long> {
List<Customer> findByLastNameOrderByFirstNameAsc(String lastName);
// Dynamic sort, supplied by the caller
List<Customer> findByCity(String city, Sort sort);
}Limiting with First and Top
To restrict how many rows come back, add First or Top right after the subject. They are interchangeable, and an optional number sets the limit.
findFirstByOrderByCreatedAtDesc→ the single newest rowfindTop3ByCategory→ at most 3 rows for that category
Combined with OrderBy this is the idiomatic way to fetch "the latest N" records.
public interface OrderRepository extends JpaRepository<Order, Long> {
Order findFirstByCustomerIdOrderByPlacedAtDesc(Long customerId);
List<Order> findTop5ByStatusOrderByPlacedAtDesc(String status);
}Traversing Nested Properties
Derived queries can reach into related entities. If Order has a Customer and the customer has an address.city, you can write findByCustomerAddressCity.
Spring resolves the path greedily, splitting on camel-case humps. When a property name is itself ambiguous (e.g. a field literally named customerAddress), insert an underscore to make the boundary explicit: findByCustomer_AddressCity.
public interface OrderRepository extends JpaRepository<Order, Long> {
// Order -> customer -> address -> city
List<Order> findByCustomerAddressCity(String city);
// Explicit traversal boundary with underscore
List<Order> findByCustomer_AddressCity(String city);
}Counting, Existence, and Deletion
The subject keyword controls the operation, not just selection. Beyond find, you can derive:
countBy...→ returns alongexistsBy...→ returns abooleandeleteBy.../removeBy...→ deletes matching rows (use with@Transactional)
The predicate grammar is identical; only the return type and the action change.
public interface UserRepository extends JpaRepository<User, Long> {
long countByActiveTrue();
boolean existsByEmail(String email);
@Transactional
long deleteByLastLoginBefore(LocalDateTime cutoff);
}How Keyword Resolution Actually Works
At application startup, Spring Data parses each method name into a PartTree. For every segment it tries the longest matching property path first, then peels off trailing keywords.
- It validates each property against the entity's metamodel — a typo like
findByemaillfails fast withPropertyReferenceException. - Because parsing happens at startup, broken method names break the context immediately, not at first call.
This pure-Java example shows the same camel-case splitting idea the parser uses.
public class PartTreeDemo {
public static void main(String[] args) {
String predicate = "FirstNameAndLastName";
String[] parts = predicate.split("And");
for (String p : parts) {
// Lower-case the first letter to get the property name
String prop = Character.toLowerCase(p.charAt(0)) + p.substring(1);
System.out.println("Property: " + prop);
}
}
}Quick Check
You need a repository method that returns the 3 most recently placed orders for a given status, newest first. Which derived method name is correct?
Recap
You now know how to build queries straight from method names:
- Subject (
find/read/get/count/exists/delete) sets the operation; predicate afterBybecomes the WHERE clause. - Combine fields with
And/Or; compare withLessThan,Between,After; match text withContaining,StartingWith,IgnoreCase. - Parameter-free keywords:
IsNull,True,False. - Sort with
OrderBy...Asc/Desc(or aSortparam); limit withFirst/Top[N]. - Traverse relations (
findByCustomerAddressCity, use_to disambiguate). - Spring parses names into a PartTree at startup, so invalid property paths fail fast.
For very long or complex names, switch to @Query — readability beats cleverness.
Często zadawane pytania
Czy lekcja „Pochodne metody zapytań i rozpoznawanie słów kluczowych” jest bezpłatna?
Tak — pełny tekst „Pochodne metody zapytań i rozpoznawanie słów kluczowych” 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 Spring Boot 4 Complete Guide, przejdź na CoddyKit PRO. Kurs Spring Boot 4 Complete Guide zawiera 4 lekcji w sumie.
Co nauczysz się w „Pochodne metody zapytań i rozpoznawanie słów kluczowych”?
Buduj złożone zapytania repozytoriów wyłącznie na podstawie nazw metod, korzystając z gramatyki właściwości i słów kluczowych Spring Data. Ćwiczysz Spring Boot 4 Complete Guide 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ąć Spring Boot 4 Complete Guide?
Nie wymagamy żadnego doświadczenia. Spring Boot 4 Complete Guide 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 1 z 4.
Ile czasu zajmuje lekcja „Pochodne metody zapytań i rozpoznawanie słów kluczowych”?
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 Spring Boot 4 Complete Guide?
Tak. Każda lekcja Spring Boot 4 Complete Guide 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
- Pochodne metody zapytań i rozpoznawanie słów kluczowych
- JPQL i zapytania natywne za pomocą @Query
- Specyfikacje i dynamiczne filtrowanie oparte na kryteriach
- Paginacja, sortowanie i strumieniowanie fragmentów