📋
Data Access

Repositories

CrudRepository, JpaRepository
💡 Repository ek LIBRARIAN hai — tum EXACT SQL query nahi likhते (ki "kaunse shelf, kaunse row mein book hai"), tum SIRF batate ho kya CHAHIYE ("findByEmail") — librarian (Spring Data JPA) khud jaanता hai KAISE dhoondna hai.

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);
📋
Repository ek LIBRARIAN hai — tum EXACT SQL query nahi likhते (ki "kaunse shelf, kaunse row mein book hai"), tum SIRF batate ho kya CHAHIYE ("findByEmail") — librarian (Spring Data JPA) khud jaanता hai KAISE dhoondna hai.
1 / 2
⚡ Quick Recap
  • 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
On this page (2 subtopics)

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();
}