Software Dev and QA Tips

How To Write an Update Query in a JPA Repository?

Written by QASource Engineering Team | Apr 7, 2025 4:00:00 PM

In Spring Data JPA, you can write an update query using the @Modifying and @Query annotations in a JPA Repository. Since JPA does not provide an out-of-the-box update method in repositories, you must define a custom query using JPQL (Java Persistence Query Language) or native SQL.

Example 1: Writing an Update Query in JPA Repository using JPQL

Steps

1. Use @Modifying to indicate a modifying query (such as UPDATE or DELETE).

2. Use @Query to define the update statement.

3. Use @Transactional to ensure the query runs within a transaction.

4. Use @Param to pass parameters.

@Repository
public interface UserRepository extends JpaRepository<User, Long>
{

	@Modifying
	@Transactional
	@Query("UPDATE User u1 SET u1.status = :status WHERE u1.id = :id")
	int updateUserStatus(@Param("id") Long id, @Param("status") String status);
}

Explanation

  • The @Query annotation defines an update query using JPQL.
  • The @Modifying annotation tells Spring Data JPA that this is an update operation.
  • The @Transactional annotation ensures the method runs within a transaction.
  • The method returns int, which represents the number of updated rows.
 

Example 2: Using Native SQL

Steps

5. Annotate the method with @Modifying.

6. Use @Query with the parameter nativeQuery = true.

7. Ensure transactional context with @Transactional.

8. Define method parameters with @Param.

@Repository
public interface UserRepository extends JpaRepository<User, Long> 
{
	@Modifying
	@Transactional
	@Query(value = "UPDATE users SET status = :status WHERE id = :id", nativeQuery = true)
	int updateUserStatusNative(@Param("id") Long id, @Param("status") String status);
}

Explanation

The nativeQuery = true flag tells JPA to use raw SQL instead of JPQL.

Ensure the table name (users) matches your actual database table.

 

Usage in Service Layer

Call this method from your service class:

@Service
public class UserService {

	@Autowired
	private UserRepository userRepository;

	public void changeUserStatus(Long userId, String newStatus) {
    	userRepository.updateUserStatus(userId, newStatus);
	}
}
 

Key Points to Remember

  • Use @Modifying with @Query for update/delete queries.
  • Use @Transactional to ensure database consistency.
  • Use JPQL for portability across databases, but Native SQL if required.
  • Returns int, indicating the number of updated rows.