Skip to content

Interview ‐ Spring Data (JpaRepository, MongoRepository)

Yash edited this page Mar 6, 2026 · 4 revisions

📘 Spring Data Repository Interface

Repository Hierarchy

Repository<T, ID>                               ← Marker interface (no methods)
  └── CrudRepository<T, ID>                     ← Basic CRUD operations
        └── PagingAndSortingRepository<T, ID>   ← + Sorting & Pagination
              ├── JpaRepository<T, ID>          ← + JPA-specific (flush, batch delete, getOne)
              └── MongoRepository<T, ID>        ← + Mongo-specific (insert)

Both JpaRepository and MongoRepository also extend QueryByExampleExecutor<T>.

JpaRepository MongoRepository
package org.springframework.data.jpa.repository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;
@org.springframework.data.repository.NoRepositoryBean
public interface JpaRepository<T, ID> extends 
                       PagingAndSortingRepository<T, ID>,
                       QueryByExampleExecutor<T> {
    @Override
    List<T> findAll();
    @Override
    List<T> findAll(Sort sort);
    @Override
    List<T> findAllById(Iterable<ID> ids);
    @Override
    <S extends T> List<S> saveAll(Iterable<S> entities);
    // Flushes all pending changes to the database.
    void flush();
    // Saves an entity and flushes changes instantly.
    <S extends T> S saveAndFlush(S entity);
    void deleteInBatch(Iterable<T> entities);
    void deleteAllInBatch();
    T getOne(ID id);
    @Override
    <S extends T> List<S> findAll(Example<S> example);
    @Override
    <S extends T> List<S> findAll(Example<S> example, Sort sort);
}
package org.springframework.data.mongodb.repository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;
@org.springframework.data.repository.NoRepositoryBean
public interface MongoRepository<T, ID> extends 
                       PagingAndSortingRepository<T, ID>,
                       QueryByExampleExecutor<T> {
    @Override
    <S extends T> List<S> saveAll(Iterable<S> entities);
    @Override
    List<T> findAll();
    @Override
    List<T> findAll(Sort sort);
    <S extends T> S insert(S entity);
    <S extends T> List<S> insert(Iterable<S> entities);
    @Override
    <S extends T> List<S> findAll(Example<S> example);
    @Override
    <S extends T> List<S> findAll(Example<S> example, Sort sort);
}
package org.springframework.data.repository;

// ── Paging & Sorting ──────────────────────────────────────────────────────────
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
    Iterable<T> findAll(org.springframework.data.domain.Sort sort);      // All records, sorted
    Page<T> findAll(org.springframework.data.domain.Pageable pageable);  // Paginated + sorted result
}
// ── Basic CRUD ────────────────────────────────────────────────────────────────
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
    <S extends T> S save(S entity);                          // Insert or Update (upsert)
    <S extends T> Iterable<S> saveAll(Iterable<S> entities); // Bulk upsert
    Optional<T> findById(ID id);                             // Find by PK → Optional (never null)
    boolean existsById(ID id);                               // Check existence by PK
    Iterable<T> findAll();                                   // Fetch all records
    Iterable<T> findAllById(Iterable<ID> ids);               // Fetch by list of PKs
    long count();                                            // Total row/document count
    void deleteById(ID id);                                  // Delete by PK
    void delete(T entity);                                   // Delete given entity
    void deleteAll(Iterable<? extends T> entities);          // Delete given list
    void deleteAll();                                        // Delete everything — USE WITH CAUTION
}
// ── Marker interface ──────────────────────────────────────────────────────────
@Indexed
public interface Repository<T, ID> { }

Maven Dependency, application.properties

spring-boot-starter-data-jpa spring-boot-starter-data-mongodb
Maven Dependency
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <exclusions>
        <!-- Exclude HikariCP if using Tomcat JDBC pool instead -->
        <exclusion>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- SQL Server JDBC driver -->
<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <scope>runtime</scope>
</dependency>
<!-- Tomcat JDBC Connection Pool (if replacing HikariCP) -->
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-jdbc</artifactId>
</dependency>
application.properties
#-----------------------------------------
# SQL Server DataBase Properties
#-----------------------------------------
spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=finance
spring.datasource.username=sa
spring.datasource.password=Strong@123
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServerDialect

#-----------------------------------------
# DataBase Connection Pool (Tomcat JDBC)
#-----------------------------------------
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.test-while-idle=true
spring.datasource.tomcat.test-on-return=false
spring.datasource.tomcat.validation-query=select 1
spring.datasource.tomcat.initial-size=15
spring.datasource.tomcat.max-wait=20000
spring.datasource.tomcat.max-active=50
spring.datasource.tomcat.max-idle=15
spring.datasource.tomcat.min-idle=8
spring.datasource.tomcat.default-auto-commit=true
spring.datasource.tomcat.log-validation-errors=true
spring.datasource.log-abandoned=true

#-----------------------------------------
# JPA / Hibernate Properties
#-----------------------------------------
# none | validate | update | create | create-drop
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=false
# Preserve column names as declared in @Column(name="...")
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
# Required for @CreatedDate / @LastModifiedDate to work
spring.jpa.properties.javax.persistence.validation.mode=none
Maven Dependency
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
#-----------------------------------------
# MongoDB Properties
#-----------------------------------------
spring.data.mongodb.uri=mongodb://localhost:27017/local?authSource=admin&ssl=false&maxPoolSize=1000

# Alternative: individual properties
# spring.data.mongodb.host=localhost
# spring.data.mongodb.port=27017
# spring.data.mongodb.database=local
# spring.data.mongodb.username=admin
# spring.data.mongodb.password=secret

Clone this wiki locally