Mit executeQuery () können keine Datenmanipulationsanweisungen ausgegeben werden.


97

In MySQL habe ich zwei Tabellen tableAund tableB. Ich versuche zwei Abfragen auszuführen:

executeQuery(query1) 
executeQuery(query2)

Aber ich bekomme folgenden Fehler:

can not issue data manipulation statements with executeQuery().

Was bedeutet das?


Haben Sie einen anderen Zugriff auf MySQL als über JDBC - MySQL Administrator? Oder Kommandozeile?
— OMG Ponys

Ich habe den Zugriff auf MySQL-Administrator. Die Anforderung ist jedoch so, dass. Die MySQL-Datenbank wird mit MySQL-Administrator erstellt, geändert, aktualisiert usw., danach müssen jedoch alle Vorgänge mit Java ausgeführt werden.
— Silverkid

Es ist besser, die Indexerstellung in Skripte zum Erstellen der Datenbank aufzunehmen als über JDBC, wahrscheinlich nachdem Sie sie bereits verwendet haben könnten.
— OMG Ponys

Antworten:


185

Um Daten zu manipulieren, benötigen Sie tatsächlich executeUpdate()eher als executeQuery().

Hier ist ein Auszug aus dem executeUpdate()Javadoc, der bereits eine Antwort für sich ist:

Führt die angegebene SQL-Anweisung aus, die eine INSERT-, UPDATE- oder DELETE-Anweisung oder eine SQL-Anweisung sein kann, die nichts zurückgibt, z. B. eine SQL-DDL-Anweisung.


32

Wenn Sie eine DML-Anweisung ausführen, sollten Sie executeUpdate/ executeanstatt verwenden executeQuery.

Hier ist ein kurzer Vergleich:

executeQueryVSexecuteUpdateVSexecute


17

Wenn Sie Spring Boot verwenden, fügen Sie einfach eine @ Modifying-Anmerkung hinzu.

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

1
für die Löschanweisung im Frühjahr Boot Repository @Transactional wird helfen
— Abhishek Chudekar

codar.club/blogs/5cd7f06bec80a.html erläutert die Verwendung von Änderungs-, Transaktions- und Abfrageanmerkungen. Ich habe mein Problem gelöst mit: @Modifying(clearAutomatically = true) @Transactionaldirekt über der @ Query-Annotation, die meine Löschabfrage definiert
— user666

16

Verwenden Sie executeUpdate()diese Option, um Datenmanipulationsanweisungen auszugeben. executeQuery()ist nur für SELECT-Abfragen gedacht (dh Abfragen, die eine Ergebnismenge zurückgeben).


11

Zum Löschen der Abfrage - Verwenden Sie @Modifyingund @Transactionalvor dem @QueryGleichen: -

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

}

Es wird den java.sql.SQLException: Can not issue data manipulation statements with executeQuery()Fehler nicht geben .



4

Dieser Code funktioniert für mich: Ich setze Werte mit einem INSERT und erhalte die LAST_INSERT_ID () dieses Werts mit einem SELECT; Ich verwende Java NetBeans 8.1, MySql und 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()gibt a zurück ResultSet. Ich bin nicht so vertraut mit Java / MySQL, aber um Indizes zu erstellen, möchten Sie wahrscheinlich eine executeUpdate().


2
Es erwartet keine ResultSet. Es stattdessen kehrt ein ResultSet.
— BalusC

2
Es wird erwartet, dass eine Ergebnismenge aus der Datenbank das ist, was ich meine.
— 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); 

Vergessen Sie nicht, vor @query @Modifying und @Transnational hinzuzufügen. Für mich geht das.

Um den Datensatz unter bestimmten Bedingungen mithilfe einer nativen Abfrage mit JPA zu löschen, sind die oben genannten Anmerkungen wichtig.


-1

Neben executeUpdate () in Klammern müssen Sie auch eine Variable hinzufügen, um eine SQL-Anweisung zu verwenden.

Beispielsweise:

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

Hallo! Als Heads-up müssen Fragen und Antworten zu Stack Overflow in englischer Sprache verfasst sein (andernfalls besteht die Gefahr, dass sie gelöscht und / oder von Google übersetzt werden). Prost! ( Hola! Como las cabezas para arriba, las preguntas y respuestas sobre Stack Overflow debe estar escrito en Inglés (von Google Traductor). ¡Salud! )
— Chris Forrence
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.