What is Native Query in Spring Data JPA?
A Native Query in Spring Data JPA is a database query written using actual SQL syntax instead of JPQL.
Native queries allow developers to execute database-specific SQL queries directly from Spring Boot applications.
In simple words:
βNative query means writing real SQL queries inside Spring Data JPA.β
Why Native Queries are Needed
JPQL is powerful, but sometimes it has limitations.
Certain database operations require:
- Complex joins
- Database-specific functions
- Stored procedures
- Advanced SQL optimizations
Native queries solve these problems.
Simple Real-Time Example
JPQL query:
SELECT s FROM Student s
Equivalent native SQL query:
SELECT * FROM students
Main Difference Between JPQL and Native Query
| Feature | JPQL | Native Query |
|---|---|---|
| Works On | Entity classes | Database tables |
| Uses | Entity names | Table names |
| Database Independent | Yes | No |
| Supports DB-specific features | Limited | Yes |
How to Create Native Query in Spring Data JPA
Native queries are created using:
@Query
annotation with:
nativeQuery = true
Basic Native Query Example
@Query(
value = "SELECT * FROM students",
nativeQuery = true
)
List<Student> getAllStudents();
What Happens Internally?
- Developer writes SQL query
- Spring Data JPA sends query directly to database
- Database executes SQL
- Results are mapped to entity objects
Entity Example
@Entity
@Table(name = "students")
public class Student {
@Id
private Long id;
private String name;
private String email;
}
Find by ID Native Query Example
@Query(
value = """
SELECT *
FROM students
WHERE id = :id
""",
nativeQuery = true
)
Student findStudentById(Long id);
Generated SQL
Query is executed directly without JPQL conversion.
Using Named Parameters
Native queries support named parameters.
Example
@Query(
value = """
SELECT *
FROM students
WHERE email = :email
""",
nativeQuery = true
)
Student findByEmail(
@Param("email") String email
);
Using Positional Parameters
Native queries also support positional parameters.
Example
@Query(
value = """
SELECT *
FROM students
WHERE name = ?1
""",
nativeQuery = true
)
Student findByName(String name);
INSERT Native Query Example
INSERT operations require:
- @Modifying
- @Transactional
Example
@Transactional
@Modifying
@Query(
value = """
INSERT INTO students(name, email)
VALUES (:name, :email)
""",
nativeQuery = true
)
void insertStudent(
String name,
String email
);
UPDATE Native Query Example
@Transactional
@Modifying
@Query(
value = """
UPDATE students
SET name = :name
WHERE id = :id
""",
nativeQuery = true
)
void updateStudentName(
Long id,
String name
);
DELETE Native Query Example
@Transactional
@Modifying
@Query(
value = """
DELETE FROM students
WHERE id = :id
""",
nativeQuery = true
)
void deleteStudent(Long id);
JOIN Native Query Example
@Query(
value = """
SELECT o.*
FROM orders o
JOIN customers c
ON o.customer_id = c.id
WHERE c.name = :name
""",
nativeQuery = true
)
List<Order> getOrdersByCustomerName(
String name
);
Aggregation Query Example
@Query(
value = """
SELECT COUNT(*)
FROM students
""",
nativeQuery = true
)
long countStudents();
Database-Specific Function Example
Native queries support database-specific functions.
MySQL Example
@Query(
value = """
SELECT NOW()
""",
nativeQuery = true
)
String getCurrentTime();
Pagination with Native Queries
Native queries support pagination using:
- Pageable
- LIMIT
Example
@Query(
value = """
SELECT *
FROM students
""",
nativeQuery = true
)
Page<Student> getStudents(
Pageable pageable
);
Stored Procedure Example
Native queries can execute stored procedures.
Example
@Query(
value = "CALL get_all_students()",
nativeQuery = true
)
List<Student> getStudentsUsingProcedure();
Advantages of Native Queries
- Supports complex SQL
- Uses database-specific features
- Better performance optimization
- Supports stored procedures
- Full SQL flexibility
Disadvantages of Native Queries
- Database dependent
- Less portable
- More difficult maintenance
- Can bypass ORM optimizations
When to Use Native Queries
- Complex joins
- Performance optimization
- Stored procedures
- Database-specific functions
- Complex reporting queries
When NOT to Use Native Queries
- Simple CRUD operations
- Database-independent applications
- Simple JPQL-compatible queries
Real-Time Example in E-Commerce Application
E-commerce systems often require:
- Sales reports
- Revenue calculations
- Complex analytics
- Optimized joins
Native queries help implement these efficiently.
Real-Time Example in Banking Application
Banking systems may require:
- Transaction aggregation
- Large report generation
- Database-specific optimizations
Native queries improve performance in such cases.
Best Practices for Native Queries
- Use JPQL when possible
- Use native queries only when necessary
- Prefer named parameters
- Avoid hardcoding database-specific syntax unnecessarily
- Optimize indexes and joins
Difference Between Native Query and JPQL
| Feature | Native Query | JPQL |
|---|---|---|
| Uses | SQL tables | Entity classes |
| Database Portability | Lower | Higher |
| Performance Tuning | Better | Limited |
| Database Functions | Full support | Limited |
Common Interview Questions on Native Queries
What is a native query in Spring Data JPA?
A native query is a real SQL query executed directly on the database.
How do you define a native query?
Using @Query with nativeQuery = true.
What is the difference between JPQL and native query?
JPQL uses entities, while native queries use database tables.
Can native queries perform INSERT and UPDATE operations?
Yes, using @Modifying and @Transactional.
When should native queries be used?
For complex SQL, performance optimization, and database-specific operations.
Conclusion
Native queries are powerful features in Spring Data JPA that allow developers to execute real SQL queries directly.
They help developers:
- Handle complex database operations
- Use database-specific features
- Optimize query performance
- Execute stored procedures
Understanding native queries is essential for Spring Boot developers because enterprise applications often require advanced reporting, optimized SQL, and database-specific functionality.
Proper use of native queries improves:
- Performance
- Scalability
- Complex query handling
- Database optimization