Bird
Raised Fist0
Spring Bootframework~20 mins

@Query for custom JPQL in Spring Boot - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

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
Challenge - 5 Problems
🎖️
JPQL Mastery Badge
Get all challenges correct to earn this badge!
Test your skills under time pressure!
component_behavior
intermediate
2:00remaining
What is the output of this JPQL query method?
Given the following Spring Data repository method using @Query, what will be the result when calling findActiveUsers() if the database has 3 users with active = true and 2 users with active = false?
Spring Boot
public interface UserRepository extends JpaRepository<User, Long> {
  @Query("SELECT u FROM User u WHERE u.active = true")
  List<User> findActiveUsers();
}
AA list containing 2 User objects with active = false
BA list containing all 5 User objects regardless of active status
CAn empty list
DA list containing 3 User objects with active = true
Attempts:
2 left
💡 Hint
Look at the WHERE clause in the JPQL query.
📝 Syntax
intermediate
2:00remaining
Which @Query syntax is correct for selecting users by email?
You want to write a JPQL query to find a user by their email address. Which of the following @Query annotations is syntactically correct?
A@Query("SELECT u FROM User u WHERE u.email == :email")
B@Query("SELECT * FROM User WHERE email = :email")
C@Query("SELECT u FROM User u WHERE u.email = :email")
D@Query("SELECT u FROM User u WHERE u.email = ?1")
Attempts:
2 left
💡 Hint
JPQL uses entity names and fields, not table names or SQL syntax.
🔧 Debug
advanced
2:00remaining
What error does this @Query cause?
Consider this repository method:
 @Query("SELECT u FROM User u WHERE u.name = ?2")
User findByName(String name);
What error will occur when this method is called?
Aorg.springframework.dao.InvalidDataAccessApiUsageException due to parameter index out of bounds
BNo error, method works correctly
CSyntax error in JPQL query
DNullPointerException at runtime
Attempts:
2 left
💡 Hint
Check the parameter index used in the query and method signature.
🧠 Conceptual
advanced
2:00remaining
Which statement about @Query and JPQL is true?
Select the correct statement about using @Query with JPQL in Spring Data repositories.
A@Query cannot use parameters and must hardcode values.
B@Query allows defining JPQL queries that use entity names and fields, not table names.
C@Query queries must always use native SQL syntax.
D@Query queries are automatically converted to REST endpoints.
Attempts:
2 left
💡 Hint
Think about what JPQL queries look like compared to SQL.
state_output
expert
3:00remaining
What is the result of this @Query with JOIN and parameter?
Given these entities: User and Order, where User has a collection of Orders. Consider this repository method:
@Query("SELECT u FROM User u JOIN u.orders o WHERE o.status = :status")
List findUsersByOrderStatus(@Param("status") String status);
If the database has 2 users with orders of status 'SHIPPED' and 1 user with orders of status 'PENDING', what does calling findUsersByOrderStatus("SHIPPED") return?
AA list of 2 User objects who have at least one order with status 'SHIPPED'
BA list of all users regardless of order status
CA list of 1 User object with orders status 'PENDING'
DAn empty list
Attempts:
2 left
💡 Hint
The query joins users with their orders and filters by order status.

Practice

(1/5)
1. What is the main purpose of using @Query annotation in Spring Data JPA?
easy
A. To write custom JPQL or SQL queries when default methods are insufficient
B. To automatically generate database tables
C. To configure database connection properties
D. To define entity relationships

Solution

  1. Step 1: Understand default query methods

    Spring Data JPA provides default query methods like findById, but they are limited.
  2. Step 2: Role of @Query

    @Query allows writing custom JPQL or SQL queries to handle complex or specific data retrieval needs.
  3. Final Answer:

    To write custom JPQL or SQL queries when default methods are insufficient -> Option A
  4. Quick Check:

    @Query purpose = custom queries [OK]
Hint: Remember @Query is for custom queries beyond defaults [OK]
Common Mistakes:
  • Thinking @Query creates tables
  • Confusing @Query with database config
  • Assuming @Query defines entity relations
2. Which of the following is the correct syntax to define a custom JPQL query using @Query in a Spring Data JPA repository interface?
easy
A. @Query("SELECT u FROM User u WHERE u.name = :name") List<User> findByName(@Param("name") String name);
B. @Query(SELECT * FROM User WHERE name = :name) List<User> findByName(String name);
C. @Query("SELECT * FROM User WHERE name = ?1") List<User> findByName(String name);
D. @Query("FROM User WHERE name = ?") List<User> findByName(@Param("name") String name);

Solution

  1. Step 1: Check JPQL syntax

    JPQL uses entity names and fields, not table names or * syntax.
  2. Step 2: Parameter binding

    Named parameters use :paramName and must be linked with @Param("paramName") in method.
  3. Final Answer:

    @Query("SELECT u FROM User u WHERE u.name = :name") List<User> findByName(@Param("name") String name); -> Option A
  4. Quick Check:

    JPQL + named param + @Param = correct syntax [OK]
Hint: Use entity names and :param with @Param for correct JPQL [OK]
Common Mistakes:
  • Using SQL syntax (*) instead of JPQL
  • Missing @Param annotation for named parameters
  • Using positional parameters incorrectly
3. Given the repository method:
@Query("SELECT u FROM User u WHERE u.age > :minAge")
List<User> findUsersOlderThan(@Param("minAge") int minAge);

What will be the result of calling findUsersOlderThan(30)?
medium
A. A list of User entities with age less than 30
B. A list of User entities with age equal to 30
C. A list of User entities with age greater than 30
D. A runtime error due to missing parameter

Solution

  1. Step 1: Analyze the JPQL query

    The query selects users where age is greater than the parameter minAge.
  2. Step 2: Understand method call

    Calling findUsersOlderThan(30) sets minAge to 30, so users older than 30 are returned.
  3. Final Answer:

    A list of User entities with age greater than 30 -> Option C
  4. Quick Check:

    minAge=30, query > minAge = users older than 30 [OK]
Hint: Check parameter value and query condition carefully [OK]
Common Mistakes:
  • Confusing > with >= or =
  • Assuming parameter is ignored
  • Expecting users younger than 30
4. Identify the error in the following repository method:
@Query("SELECT u FROM User u WHERE u.email = :email")
List<User> findByEmail(String email);
medium
A. JPQL query uses wrong entity name
B. Missing @Param annotation for the email parameter
C. Return type should be User, not List<User>
D. Query should use native SQL syntax

Solution

  1. Step 1: Check parameter binding

    The query uses a named parameter :email, so the method parameter must have @Param("email") annotation.
  2. Step 2: Validate other parts

    Entity name User is correct, return type List<User> is valid, and JPQL syntax is correct.
  3. Final Answer:

    Missing @Param annotation for the email parameter -> Option B
  4. Quick Check:

    Named param requires @Param annotation [OK]
Hint: Always add @Param for named parameters in @Query [OK]
Common Mistakes:
  • Omitting @Param causes runtime errors
  • Confusing JPQL with native SQL
  • Assuming return type must be single entity
5. You want to write a custom JPQL query using @Query to find all users whose name contains a given substring (case insensitive). Which of the following method definitions correctly achieves this?
hard
A. @Query("SELECT u FROM User u WHERE u.name LIKE :namePart") List<User> findByNameLike(@Param("namePart") String namePart);
B. @Query("SELECT u FROM User u WHERE u.name LIKE '%:namePart%'") List<User> findByNameContains(@Param("namePart") String namePart);
C. @Query("SELECT u FROM User u WHERE u.name = :namePart") List<User> findByNameExact(@Param("namePart") String namePart);
D. @Query("SELECT u FROM User u WHERE LOWER(u.name) LIKE LOWER(CONCAT('%', :namePart, '%'))") List<User> findByNameContainsIgnoreCase(@Param("namePart") String namePart);

Solution

  1. Step 1: Understand case insensitive search

    Use LOWER() on both field and parameter to ignore case.
  2. Step 2: Use LIKE with wildcards

    Concatenate '%' before and after parameter to find substring matches.
  3. Step 3: Check parameter binding

    Named parameter :namePart is linked with @Param("namePart") correctly.
  4. Final Answer:

    @Query("SELECT u FROM User u WHERE LOWER(u.name) LIKE LOWER(CONCAT('%', :namePart, '%'))") List<User> findByNameContainsIgnoreCase(@Param("namePart") String namePart); -> Option D
  5. Quick Check:

    LOWER + LIKE + CONCAT + @Param = correct case-insensitive contains [OK]
Hint: Use LOWER() and CONCAT('%', param, '%') for case-insensitive contains [OK]
Common Mistakes:
  • Using LIKE with parameter inside quotes disables binding
  • Not using LOWER() for case insensitivity
  • Using = instead of LIKE for substring search