Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Native SQL Queries in Spring Boot
📖 Scenario: You are building a simple Spring Boot application to manage a list of books in a library. You want to use native SQL queries to fetch data directly from the database.
🎯 Goal: Create a Spring Boot repository interface that uses native SQL queries to retrieve books from the database.
📋 What You'll Learn
Create an entity class Book with fields id, title, and author.
Create a repository interface BookRepository that extends JpaRepository.
Add a native SQL query method to find books by author name.
Add a native SQL query method to find all books ordered by title.
💡 Why This Matters
🌍 Real World
Native SQL queries let you write exact SQL commands when you want more control or need database-specific features in Spring Boot applications.
💼 Career
Many backend developer roles require knowledge of JPA and native SQL queries to optimize database access and handle complex queries.
Progress0 / 4 steps
1
Create the Book entity
Create a class called Book annotated with @Entity. Add fields id (annotated with @Id and @GeneratedValue), title, and author all of type String except id which is Long. Include getters and setters.
Spring Boot
Hint
Use @Entity on the class. Use @Id and @GeneratedValue(strategy = GenerationType.IDENTITY) on the id field.
2
Create the BookRepository interface
Create an interface called BookRepository that extends JpaRepository<Book, Long>. This will allow basic CRUD operations on Book entities.
Spring Boot
Hint
Use public interface BookRepository extends JpaRepository<Book, Long>.
3
Add native SQL query to find books by author
In BookRepository, add a method List<Book> findByAuthorNative(String author) annotated with @Query using native SQL: SELECT * FROM book WHERE author = :author. Use nativeQuery = true in the annotation.
Spring Boot
Hint
Use @Query with nativeQuery = true and write the SQL exactly as SELECT * FROM book WHERE author = :author.
4
Add native SQL query to find all books ordered by title
In BookRepository, add a method List<Book> findAllOrderByTitleNative() annotated with @Query using native SQL: SELECT * FROM book ORDER BY title. Use nativeQuery = true in the annotation.
Spring Boot
Hint
Use @Query with nativeQuery = true and write the SQL exactly as SELECT * FROM book ORDER BY title.
Practice
(1/5)
1. What annotation is used in Spring Boot to define a native SQL query inside a repository interface?
easy
A. @SqlQuery
B. @NativeQuery
C. @Query with nativeQuery = true
D. @SQLNative
Solution
Step 1: Recognize the annotation for queries in Spring Data JPA
The @Query annotation is used to define custom queries in repository interfaces.
Step 2: Identify how to specify native SQL
Setting nativeQuery = true inside @Query tells Spring Boot to treat the query as native SQL.
Final Answer:
@Query with nativeQuery = true -> Option C
Quick Check:
Native SQL queries use @Query(nativeQuery = true) [OK]
Hint: Look for @Query with nativeQuery true flag [OK]
Common Mistakes:
Using a non-existent annotation like @NativeQuery
Forgetting to set nativeQuery = true
Confusing @Query with @SqlQuery
Using @SQLNative which is invalid
2. Which of the following is the correct syntax to write a native SQL query in a Spring Boot repository method?
easy
A. @Query(value = "SELECT * FROM users", nativeQuery = true)
B. @Query(native = true, value = "SELECT * FROM users")
C. @NativeQuery("SELECT * FROM users")
D. @Query(sql = "SELECT * FROM users")
Solution
Step 1: Recall the correct attribute names in @Query
The attribute for the query string is value, and to mark it native SQL, use nativeQuery = true.
Step 2: Check each option's syntax
@Query(value = "SELECT * FROM users", nativeQuery = true) correctly uses @Query(value = "...", nativeQuery = true). Options B, C, and D use invalid attribute names or annotations.
Final Answer:
@Query(value = "SELECT * FROM users", nativeQuery = true) -> Option A
Quick Check:
@Query(value=..., nativeQuery=true) is correct syntax [OK]
Hint: Use value= for query and nativeQuery=true [OK]
Common Mistakes:
Using native=true instead of nativeQuery=true
Using @NativeQuery annotation which doesn't exist
Using sql= instead of value= for query string
Swapping attribute order incorrectly
3. Given this repository method:
@Query(value = "SELECT * FROM products WHERE price > ?1", nativeQuery = true)
List<Product> findExpensiveProducts(double minPrice);
What will be the result of calling findExpensiveProducts(100.0)?
medium
A. List of products with price less than 100.0
B. Empty list always
C. Syntax error due to ?1 placeholder
D. List of products with price greater than 100.0
Solution
Step 1: Understand the native SQL query with parameter
The query selects all products where price is greater than the first parameter (?1), which is passed as 100.0.
Step 2: Predict the method output
Calling findExpensiveProducts(100.0) returns products priced above 100.0, so the list contains those products.
Final Answer:
List of products with price greater than 100.0 -> Option D
Quick Check:
Native query with ?1 uses method parameter [OK]
Hint: ?1 matches first method parameter in native query [OK]
Common Mistakes:
Thinking ?1 is invalid in native queries
Confusing greater than with less than
Assuming empty list without data
Believing syntax error due to placeholder
4. Identify the error in this native query method:
@Query(value = "SELECT * FROM orders WHERE status = :status", nativeQuery = true)
List<Order> findByStatus(String status);
medium
A. Named parameter :status is not supported in native queries
B. Query string should use ?1 instead of :status
C. Missing nativeQuery = true flag
D. Method return type should be Optional<Order>
Solution
Step 1: Check parameter usage in native queries
Native SQL queries in Spring Boot do not support named parameters like :status by default; they require positional parameters like ?1.
Step 2: Identify correct parameter syntax
The query should use ?1 to refer to the first method parameter instead of :status.
Final Answer:
Query string should use ?1 instead of :status -> Option B
Quick Check:
Native queries use positional parameters like ?1 [OK]
Hint: Use ?1 for parameters in native queries, not :name [OK]
Common Mistakes:
Using named parameters in native queries
Forgetting nativeQuery = true
Assuming return type must be Optional
Confusing JPQL and native SQL syntax
5. You want to write a native SQL query in Spring Boot to update the price of all products in a category. Which method signature and annotation is correct?
hard
A. @Modifying
@Query(value = "UPDATE products SET price = price * 1.1 WHERE category = ?1", nativeQuery = true)
int increasePriceByCategory(String category);
B. @Query(value = "UPDATE products SET price = price * 1.1 WHERE category = ?1", nativeQuery = true)
void increasePriceByCategory(String category);
C. @Modifying
@Query(value = "UPDATE products SET price = price * 1.1 WHERE category = :category", nativeQuery = true)
int increasePriceByCategory(String category);
D. @Modifying
@Query(value = "UPDATE products SET price = price * 1.1 WHERE category = ?1")
int increasePriceByCategory(String category);
Solution
Step 1: Recognize update queries need @Modifying
In Spring Boot, native update queries require the @Modifying annotation to indicate a modifying operation.
Step 2: Check parameter syntax and nativeQuery flag
@Modifying
@Query(value = "UPDATE products SET price = price * 1.1 WHERE category = ?1", nativeQuery = true)
int increasePriceByCategory(String category); correctly uses positional parameter ?1 and sets nativeQuery = true. @Modifying
@Query(value = "UPDATE products SET price = price * 1.1 WHERE category = :category", nativeQuery = true)
int increasePriceByCategory(String category); uses named parameter which is invalid in native queries. @Modifying
@Query(value = "UPDATE products SET price = price * 1.1 WHERE category = ?1")
int increasePriceByCategory(String category); misses nativeQuery flag. @Query(value = "UPDATE products SET price = price * 1.1 WHERE category = ?1", nativeQuery = true)
void increasePriceByCategory(String category); misses @Modifying.
Final Answer:
@Modifying
@Query(value = "UPDATE products SET price = price * 1.1 WHERE category = ?1", nativeQuery = true)
int increasePriceByCategory(String category); -> Option A
Quick Check:
Update native queries need @Modifying and nativeQuery=true [OK]
Hint: Use @Modifying and nativeQuery=true for update queries [OK]