Repositories
Repository interface hierarchy hai — Repository (marker interface) → CrudRepository (basic CRUD: save, findById, delete) → PagingAndSortingRepository (pagination/sorting add karta hai) → JpaRepository (JPA-specific extras, jaise batch operations). Practically, JpaRepository hi ZYAADATAR use hota hai — sab kuch INCLUDE karta hai.
SABSE POWERFUL feature — QUERY METHODS. Method ka NAME hi SQL query define karta hai. findByEmail(String email), findByAgeGreaterThan(int age), findByNameContainingIgnoreCase(String name) — Spring Data JPA method naam PARSE karके, AUTOMATICALLY correct query generate karta hai.
public interface UserRepository extends JpaRepository<User, Long> {
// Free CRUD methods (inherited): save, findById, findAll, deleteById...
// Query methods — naam se query generate hoti hai:
Optional<User> findByEmail(String email);
List<User> findByAgeGreaterThan(int age);
List<User> findByNameContainingIgnoreCase(String keyword);
boolean existsByEmail(String email);
}
// Usage:
List<User> adults = userRepository.findByAgeGreaterThan(18);- JpaRepository = CrudRepository + PagingAndSortingRepository + JPA extras
- Query methods = method NAAM se SQL query automatically generate hoti hai
- @Query annotation = complex queries ke liye custom JPQL/SQL
Spring Data JPA method NAME se HI SQL query GENERATE kar sakta hai — findByEmail(String email) automatically "WHERE email = ?" query banaता hai. findByAgeGreaterThan, findByNameContainingIgnoreCase — jitna COMPLEX naming convention, utni COMPLEX query automatically generate hoti hai, bina EK LINE SQL likhे.
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByEmail(String email);
List<User> findByAgeGreaterThanAndCityIgnoreCase(int age, String city);
List<User> findByNameContaining(String keyword);
}Jab query method naming se EXPRESS nahi ho sakti (complex JOINs, aggregations), @Query annotation se CUSTOM JPQL (Java Persistence Query Language, entity-based) ya native SQL likh sakte ho.
public interface OrderRepository extends JpaRepository<Order, Long> {
@Query("SELECT o FROM Order o WHERE o.total > :minTotal")
List<Order> findExpensiveOrders(@Param("minTotal") BigDecimal minTotal);
@Query(value = "SELECT * FROM orders WHERE status = 'PENDING'", nativeQuery = true)
List<Order> findPendingOrdersNative();
}