Tidak dapat mengeluarkan pernyataan manipulasi data dengan executeQuery ()

97

Di MySQL saya memiliki dua tabel, tableAdan tableB. Saya mencoba menjalankan dua kueri:

executeQuery(query1) 
executeQuery(query2)

Tetapi saya mendapatkan kesalahan berikut:

can not issue data manipulation statements with executeQuery().

Apa artinya ini?

silverkid.dll
sumber
Apakah Anda memiliki akses ke MySQL selain melalui JDBC - Administrator MySQL? Atau baris perintah?
OMG Ponies
saya memiliki akses ke admin mysql. Namun persyaratannya adalah sedemikian rupa. database mysql akan dibuat, dimodifikasi, diperbarui, dll. menggunakan admin mysql tetapi setelah itu semua operasi harus dilakukan dengan java.
silverkid
Lebih baik menyertakan pembuatan indeks dalam skrip untuk membuat database daripada melalui JDBC, kemungkinan besar setelah Anda sudah bisa menggunakannya.
OMG Ponies

Jawaban:

186

Untuk memanipulasi data yang sebenarnya Anda butuhkan executeUpdate()daripada executeQuery().

Berikut kutipan dari executeUpdate()javadoc yang sudah menjadi jawaban tersendiri:

Menjalankan pernyataan SQL yang diberikan, yang mungkin berupa pernyataan INSERT, UPDATE, atau DELETE atau pernyataan SQL yang tidak mengembalikan apa-apa, seperti pernyataan SQL DDL.

BalusC
sumber
34

Saat menjalankan pernyataan DML, Anda harus menggunakan executeUpdate/ executebukan executeQuery.

Berikut perbandingan singkatnya:

eksekusiQueryVSexecuteUpdateVSexecute

Jaskey
sumber
20

Jika Anda menggunakan boot musim semi, cukup tambahkan anotasi @Modifying.

@Modifying
@Query
(value = "UPDATE user SET middleName = 'Mudd' WHERE id = 1", nativeQuery = true)
void updateMiddleName();
Forrest
sumber
2
untuk menghapus pernyataan di repositori boot musim semi @Transactional akan membantu
Abhishek Chudekar
1
codar.club/blogs/5cd7f06bec80a.html menjelaskan penggunaan anotasi modifikasi, transaksional, dan kueri. Saya menyelesaikan masalah saya menggunakan: @Modifying(clearAutomatically = true) @Transactionaltepat di atas anotasi @Query yang mendefinisikan kueri penghapusan saya
user666
16

Gunakan executeUpdate()untuk mengeluarkan pernyataan manipulasi data. executeQuery()hanya dimaksudkan untuk query SELECT (yaitu query yang mengembalikan set hasil).

OMG Ponies
sumber
12

Untuk Hapus kueri - Gunakan @Modifyingdan @Transactionalsebelum @Querysejenisnya: -

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

}

Itu tidak akan memberikan java.sql.SQLException: Can not issue data manipulation statements with executeQuery()kesalahan.

Nitin Nanda
sumber
4

Kode ini bekerja untuk saya: Saya menetapkan nilai sedikit pun INSERT dan mendapatkan LAST_INSERT_ID () dari nilai ini dengan SELECT; Saya menggunakan java NetBeans 8.1, MySql dan 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
sumber
3

executeQuery()mengembalikan a ResultSet. Saya tidak begitu akrab dengan Java / MySQL, tetapi untuk membuat indeks Anda mungkin menginginkan file executeUpdate().

Neil N
sumber
2
Itu tidak mengharapkan a ResultSet. Ini bukan mengembalikan sebuah ResultSet.
BalusC
2
Ini mengharapkan set hasil dari DB adalah apa yang saya maksud.
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); 

Jangan lupa tambahkan @Modifying dan @Transnational sebelum @query. itu berhasil untuk saya.

Untuk menghapus record dengan beberapa kondisi menggunakan native query dengan JPA, anotasi yang disebutkan di atas menjadi penting.

Sunil
sumber
-1

Selain executeUpdate () di dalam tanda kurung, Anda juga harus menambahkan variabel untuk menggunakan pernyataan SQL.

Sebagai contoh:

PreparedStatement pst =  connection.prepareStatement(sql);
int numRowsChanged = pst.executeUpdate(sql);
veloz
sumber
Halo! Sebagai pendahuluan, pertanyaan dan jawaban di Stack Overflow harus ditulis dalam bahasa Inggris (jika tidak, berisiko terhapus dan / atau Google Terjemahan). Bersulang! ( 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