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?

Silberkind
quelle
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.

BalusC
quelle
32

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

Hier ist ein kurzer Vergleich:

executeQueryVSexecuteUpdateVSexecute

Jaskey
quelle
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();
Wald
quelle
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).

OMG Ponys
quelle
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 .

Nitin Nanda
quelle
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;}
Mati
quelle
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().

Neil N.
quelle
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.

Sunil
quelle
-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);
veloz
quelle
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