Nie można wydawać instrukcji manipulacji danymi za pomocą funkcji executeQuery ()


97

W MySQL mam dwie tabele tableAi tableB. Próbuję wykonać dwa zapytania:

executeQuery(query1) 
executeQuery(query2)

Ale pojawia się następujący błąd:

can not issue data manipulation statements with executeQuery().

Co to znaczy?


Czy masz dostęp do MySQL inny niż przez JDBC - Administrator MySQL? Lub wiersz poleceń?
OMG Kucyki

mam dostęp do administratora mysql. jednak wymóg jest taki, że. baza danych mysql zostanie utworzona, zmodyfikowana, zaktualizowana itp. za pomocą administratora mysql, ale potem wszystkie operacje muszą być wykonane za pomocą java.
silverkid

Lepiej jest włączyć tworzenie indeksu do skryptów do tworzenia bazy danych niż za pośrednictwem JDBC, prawdopodobnie po tym, jak można już było z nich korzystać.
OMG Kucyki

Odpowiedzi:


186

Aby manipulować danymi, których faktycznie potrzebujesz, executeUpdate()a nie executeQuery().

Oto wyciąg z executeUpdate()javadoc, który sam w sobie jest już odpowiedzią:

Wykonuje daną instrukcję SQL, która może być instrukcją INSERT, UPDATE lub DELETE albo instrukcją SQL, która nic nie zwraca, na przykład instrukcja SQL DDL.


34

Podczas wykonywania instrukcji DML należy raczej użyć executeUpdate/ executeniż executeQuery.

Oto krótkie porównanie:

executeQueryVSexecuteUpdateVSexecute


20

Jeśli używasz rozruchu sprężynowego, po prostu dodaj adnotację @Modifying.

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

2
do usunięcia instrukcji w wiosennym repozytorium rozruchu @Transactional pomoże
Abhishek Chudekar

1
codar.club/blogs/5cd7f06bec80a.html wyjaśnia użycie adnotacji modyfikujących, transakcyjnych i zapytań. Rozwiązałem swój problem za pomocą: @Modifying(clearAutomatically = true) @Transactionaltuż nad adnotacją @Query definiującą moje zapytanie o usunięcie
user666

16

Służy executeUpdate()do wydawania instrukcji manipulacji danymi. executeQuery()jest przeznaczony tylko dla zapytań SELECT (tj. zapytań, które zwracają zestaw wyników).


12

W przypadku zapytania o usunięcie - użyj przed @Modifyingi @Transactionalprzed @Querytakimi jak: -

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

}

To nie da java.sql.SQLException: Can not issue data manipulation statements with executeQuery()błędu.



4

Ten kod działa dla mnie: ustawiam wartości z INSERT i otrzymuję LAST_INSERT_ID () tej wartości z SELECT; Używam java NetBeans 8.1, MySql i 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()zwraca a ResultSet. Nie jestem tak zaznajomiony z Javą / MySQL, ale do tworzenia indeksów prawdopodobnie potrzebujesz executeUpdate().


2
Nie oczekuje ResultSet. Zamiast tego zwracaResultSet .
BalusC

2
Oczekuje zestawu wyników z bazy danych, co mam na myśli.
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); 

Nie zapomnij dodać @Modifying i @Transnational przed @query. mi to pasuje.

Aby usunąć rekord z jakimś stanem za pomocą natywnego zapytania z JPA, ważne są wspomniane wyżej adnotacje.


-1

Oprócz funkcji executeUpdate () w nawiasach należy również dodać zmienną, aby używać instrukcji SQL.

Na przykład:

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

Witaj! Pamiętaj, że pytania i odpowiedzi na temat Stack Overflow muszą być napisane w języku angielskim (w przeciwnym razie istnieje ryzyko usunięcia i / lub tłumaczenia Google). Twoje zdrowie! ( 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.