Impossibile emettere istruzioni di manipolazione dei dati con executeQuery ()


97

In MySQL ho due tabelle tableAe tableB. Sto cercando di eseguire due query:

executeQuery(query1) 
executeQuery(query2)

Ma ottengo il seguente errore:

can not issue data manipulation statements with executeQuery().

Cosa significa questo?


Hai accesso a MySQL diverso da JDBC - MySQL Administrator? O riga di comando?
— Pony OMG

ho accesso a mysql admin. tuttavia il requiement è tale che. il database mysql verrà creato, modificato, aggiornato, ecc. utilizzando mysql admin, ma dopo sarà necessario eseguire tutte le operazioni con java.
— silverkid

Meglio includere la creazione dell'indice negli script per creare il database piuttosto che tramite JDBC, probabilmente dopo averli già utilizzati.
— Pony OMG

Risposte:


185

Per manipolare i dati di cui hai effettivamente bisogno executeUpdate()anziché executeQuery().

Ecco un estratto dal executeUpdate()javadoc che è già una risposta a sé stante:

Esegue l'istruzione SQL specificata, che può essere un'istruzione INSERT, UPDATE o DELETE o un'istruzione SQL che non restituisce nulla, ad esempio un'istruzione DDL SQL.


32

Quando si esegue l'istruzione DML, è necessario utilizzare executeUpdate/ executeanziché executeQuery.

Ecco un breve confronto:

executeQueryVSexecuteUpdateVSexecute


19

Se stai usando lo spring boot, aggiungi semplicemente un'annotazione @Modifying.

@Modifying
@Query
(value = "UPDATE user SET middleName = 'Mudd' WHERE id = 1", nativeQuery = true)
void updateMiddleName();

2
per l'istruzione di eliminazione nel repository di avvio primaverile @Transactional aiuterà
— Abhishek Chudekar

1
codar.club/blogs/5cd7f06bec80a.html spiega l'utilizzo delle annotazioni di modifica, transazione e query. Ho risolto il mio problema utilizzando: @Modifying(clearAutomatically = true) @Transactionalappena sopra l'annotazione @Query che definisce la mia query di eliminazione
— user666

16

Utilizzare executeUpdate()per emettere dichiarazioni di manipolazione dei dati. executeQuery()è pensato solo per le query SELECT (cioè le query che restituiscono un set di risultati).


12

Per Elimina query: usa @Modifyinge @Transactionalprima di @Querysimili: -

@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);

}

Non darà l' java.sql.SQLException: Can not issue data manipulation statements with executeQuery()errore.



4

Questo codice funziona per me: imposto valori con un INSERT e ottengo il LAST_INSERT_ID () di questo valore con un SELECT; Uso java NetBeans 8.1, MySql e 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;}

3

executeQuery()restituisce a ResultSet. Non ho familiarità con Java / MySQL, ma per creare indici probabilmente vorrai un file executeUpdate().


2
Non si aspetta a ResultSet. Restituisce invece un file ResultSet.
— BalusC

2
Si aspetta che un set di risultati dal DB sia ciò che intendo.
— 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); 

Non dimenticare di aggiungere @Modifying e @Transnational prima di @query. per me funziona.

Per eliminare il record con una condizione utilizzando una query nativa con JPA, le annotazioni sopra menzionate sono importanti.


-1

Oltre a executeUpdate () tra parentesi, è necessario aggiungere anche una variabile per utilizzare un'istruzione SQL.

Per esempio:

PreparedStatement pst =  connection.prepareStatement(sql);
int numRowsChanged = pst.executeUpdate(sql);

Ciao! Come avvertimento, le domande e le risposte su Stack Overflow devono essere scritte in inglese (altrimenti corrono il rischio di cancellazione e / o traduzione di Google). Saluti! ( 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.