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

97

En MySQL tengo dos tablas tableAy tableB. Estoy intentando ejecutar dos consultas:

executeQuery(query1) 
executeQuery(query2)

Pero obtengo el siguiente error:

can not issue data manipulation statements with executeQuery().

¿Qué significa esto?

silverkid
fuente
¿Tiene algún acceso a MySQL que no sea a través de JDBC - MySQL Administrator? ¿O línea de comando?
OMG Ponies
Tengo acceso al administrador de MySQL. sin embargo, el requisito es tal que. la base de datos mysql se creará, modificará, actualizará, etc. utilizando el administrador de mysql, pero después de eso, todas las operaciones deben realizarse con java.
silverkid
Es mejor incluir la creación de índices en scripts para crear la base de datos que a través de JDBC, probablemente después de que ya los haya usado.
OMG Ponies

Respuestas:

185

Para manipular datos realmente necesita en executeUpdate()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 DDL de SQL.

BalusC
fuente
32

Al ejecutar la instrucción DML, debe usar executeUpdate/ en executelugar de executeQuery.

Aquí hay una breve comparación:

executeQueryVSexecuteUpdateVSexecute

Jaskey
fuente
19

Si está usando Spring Boot, simplemente agregue una anotación @Modifying.

@Modifying
@Query
(value = "UPDATE user SET middleName = 'Mudd' WHERE id = 1", nativeQuery = true)
void updateMiddleName();
Para descanso
fuente
2
para la declaración de eliminación en el repositorio de arranque de primavera @Transactional ayudará
Abhishek Chudekar
1
codar.club/blogs/5cd7f06bec80a.html explica el uso de anotaciones de modificación, transacciones y consultas. @Modifying(clearAutomatically = true) @TransactionalResolví mi problema usando: justo encima de la anotación @Query que define mi consulta de eliminación
user666
16

Úselo executeUpdate()para emitir declaraciones de manipulación de datos. executeQuery()solo está destinado a consultas SELECT (es decir, consultas que devuelven un conjunto de resultados).

Ponis dios mio
fuente
12

Para eliminar consulta: use @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.

Nitin Nanda
fuente
4

Este código funciona para mí: establezco valores con un INSERT y obtengo el LAST_INSERT_ID () de este valor con un SELECT; Yo uso java NetBeans 8.1, MySql y java.JDBC.driver

                try {

        String Query = "INSERT INTO `stock`(`stock`, `min_stock`,   
                `id_stock`) VALUES ("

                + "\"" + p.get_Stock().getStock() + "\", "
                + "\"" + p.get_Stock().getStockMinimo() + "\","
                + "" + "null" + ")";

        Statement st = miConexion.createStatement();
        st.executeUpdate(Query);

        java.sql.ResultSet rs;
        rs = st.executeQuery("Select LAST_INSERT_ID() from stock limit 1");                
        rs.next(); //para posicionar el puntero en la primer fila
        ultimo_id = rs.getInt("LAST_INSERT_ID()");
        } catch (SqlException ex) { ex.printTrace;}
Mati
fuente
3

executeQuery()devuelve un ResultSet. No estoy tan familiarizado con Java / MySQL, pero para crear índices probablemente desee un executeUpdate().

Neil N
fuente
2
No espera un ResultSet. En cambio, devuelve un ResultSet.
BalusC
2
Espera un conjunto de resultados de la base de datos, eso es lo que quiero decir.
Neil N
2
@Modifying
@Transactional
@Query(value = "delete from cart_item where cart_cart_id=:cart", nativeQuery = true)
public void deleteByCart(@Param("cart") int cart); 

No olvide agregar @Modifying y @Transnational antes de @query. esto funciona para mi.

Para eliminar el registro con alguna condición utilizando una consulta nativa con JPA, las anotaciones mencionadas anteriormente son importantes.

Sunil
fuente
-1

Además de executeUpdate () entre paréntesis, también debe agregar una variable para usar una declaración SQL.

Por ejemplo:

PreparedStatement pst =  connection.prepareStatement(sql);
int numRowsChanged = pst.executeUpdate(sql);
veloz
fuente
¡Hola! Como aviso, las preguntas y respuestas en Stack Overflow deben estar escritas en inglés (de lo contrario, corren el riesgo de ser eliminadas y / o de la traducción de Google). ¡Salud! ( Hola! Como las cabezas para arriba, las preguntas y respuestas sobre Stack Overflow debe estar escrito en Inglés (de lo contrario corren el riesgo de eliminación y / o Google Traductor). ¡Salud! )
Chris Forrence