Implementing data access layers requires writing repetitive DAO (Data Access Object) code: creating queries, managing EntityManager, handling transactions, mapping results. Even with Hibernate, developers still write CRUD methods for every entity — findAll, findById, save, delete, plus custom query methods.
Spring Data JPA is a data access framework that eliminates boilerplate repository code. By extending JpaRepository (or CrudRepository), interfaces automatically inherit CRUD methods without implementation. Custom queries are derived from method names (e.g., findByLastName(String name)) or defined via @Query.
- Repository interface:
public interface UserRepository extends JpaRepository<User, Long>— no implementation needed - Inherited methods:
findAll(),findById(),save(),delete(),count(),existsById()— all auto-implemented - Derived query methods: Method names like
findByEmailAndActive(String email, boolean active)— Spring Data parses the name and generates JPQL - @Query: Custom JPQL or native SQL queries for complex operations:
@Query("SELECT u FROM User u WHERE u.email = :email") - Pagination:
Pageableparameter returnsPage<T>with total count, sorting, and pagination metadata - Sorting:
Sort.by("lastName").ascending()orfindAll(Sort.by("lastName"))
- Interface-based: No implementation to write — Spring Data generates the proxy at runtime
- Derived queries: Parse method naming conventions:
findBy,readBy,countBy,deleteBy - Query methods: Support AND, OR, Between, LessThan, GreaterThan, Like, In, IgnoreCase, OrderBy
- Pagination:
Pageableparameter →Page<T>result with total elements, total pages, sorting - Sorting:
Sort.by()orPageablewith Sort; alsofindAll(Sort.by("field")) - Custom queries:
@Query("...")for JPQL;@Query(value = "...", nativeQuery = true)for native SQL - Modifying queries:
@Modifying+@Queryfor UPDATE/DELETE operations
- Built from: Spring Boot — Spring Boot auto-configures DataSource, JPA, and repository scanning
- Built from: JDBC — Spring Data JPA ultimately uses JDBC for database access
- Built from: Hibernate ORM Framework — Hibernate is the default JPA provider for Spring Data JPA
- Related: JpaRepository — The core repository interface in Spring Data JPA
- Related: JPA Query Methods — Derived query method naming conventions
- Related: JPA Pagination and Sorting — Paging and sorting with Spring Data JPA
- Derived method explosion: Complex queries with many conditions produce unwieldy method names — use
@Queryinstead - N+1 with findAll: Default
findAllfetches associations lazily — consider@EntityGraphorJOIN FETCHin@Query - Transaction boundaries: Repository methods are transactional by default, but service-layer transactions should wrap multiple repo calls
- Proxy limitation: Repository proxies can’t intercept internal method calls (method calls within the same class bypass the proxy)