No se pueden emitir declaraciones de manipulación de datos con ejecutarQuery()
En MySQL tengo dos tablas tableA
y tableB
. Estoy intentando ejecutar dos consultas:
executeQuery(query1)
executeQuery(query2)
Pero me sale el siguiente error:
can not issue data manipulation statements with executeQuery().
¿Qué quiere decir esto?
Para manipular datos realmente necesitas executeUpdate()
en lugar de executeQuery()
.
Aquí hay un extracto del executeUpdate()
javadoc que ya es una respuesta en sí misma:
Ejecuta la instrucción SQL dada, que puede ser una instrucción INSERT, UPDATE o DELETE o una instrucción SQL que no devuelve nada, como una instrucción SQL DDL.
Al ejecutar una instrucción DML, debe utilizar executeUpdate
/ execute
en lugar de executeQuery
.
He aquí una breve comparación:
Si está utilizando Spring Boot, simplemente agregue una anotación @Modifying.
@Modifying
@Query
(value = "UPDATE user SET middleName = 'Mudd' WHERE id = 1", nativeQuery = true)
void updateMiddleName();
Para eliminar consulta: utilice @Modifying
y @Transactional
antes de @Query
similares:-
@Repository
public interface CopyRepository extends JpaRepository<Copy, Integer> {
@Modifying
@Transactional
@Query(value = "DELETE FROM tbl_copy where trade_id = ?1 ; ", nativeQuery = true)
void deleteCopyByTradeId(Integer id);
}
No dará el java.sql.SQLException: Can not issue data manipulation statements with executeQuery()
error.
Editar:
Dado que esta respuesta está recibiendo muchos votos a favor, también lo remitiré a la documentación para una mayor comprensión.
@Transaccional
By default, CRUD methods on repository instances are transactional. For read operations,
the transaction configuration readOnly flag is set to true.
All others are configured with a plain @Transactional so that default transaction
configuration applies.
@Modificando
Indicates a query method should be considered as modifying query as that changes the way
it needs to be executed. This annotation is only considered if used on query methods defined
through a Query annotation). It's not applied on custom implementation methods or queries
derived from the method name as they already have control over the underlying data access
APIs or specify if they are modifying by their name.
Queries that require a @Modifying annotation include INSERT, UPDATE, DELETE, and DDL
statements.