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?

silverkid
źródło
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.

BalusC
źródło
34

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

Oto krótkie porównanie:

executeQueryVSexecuteUpdateVSexecute

Jaskey
źródło
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();
Forrest
źródło
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).

Kucyki OMG
źródło
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.

Nitin Nanda
źródło
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;}
Mati
źródło
3

executeQuery()zwraca a ResultSet. Nie jestem tak zaznajomiony z Javą / MySQL, ale do tworzenia indeksów prawdopodobnie potrzebujesz executeUpdate().

Neil N.
źródło
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.

Sunil
źródło
-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);
veloz
źródło
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