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?


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.


34

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

Berikut perbandingan singkatnya:

eksekusiQueryVSexecuteUpdateVSexecute


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

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).


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.



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;}

3

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


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.


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.