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.