No se pueden emitir declaraciones de manipulación de datos con ejecutarQuery()

Resuelto silverkid asked hace 14 años • 11 respuestas

En MySQL tengo dos tablas tableAy 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?

silverkid avatar Dec 15 '09 13:12 silverkid
Aceptado

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.

BalusC avatar Dec 15 '2009 06:12 BalusC

Al ejecutar una instrucción DML, debe utilizar executeUpdate/ executeen lugar de executeQuery.

He aquí una breve comparación:

ejecutarQueryVSexecuteActualizarVSexecute

JaskeyLam avatar Apr 22 '2016 08:04 JaskeyLam

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();
Forrest avatar Apr 15 '2019 03:04 Forrest

Para eliminar consulta: utilice @Modifyingy @Transactionalantes de @Querysimilares:-

@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.
Nitin Nanda avatar Oct 09 '2019 14:10 Nitin Nanda