निष्पादन योग्य के साथ डेटा हेरफेर कथन जारी नहीं कर सकते ()


97

MySQL में मेरे पास दो टेबल हैं, tableAऔर tableB। मैं दो प्रश्नों को निष्पादित करने का प्रयास कर रहा हूं:

executeQuery(query1) 
executeQuery(query2)

लेकिन मुझे निम्नलिखित त्रुटि मिलती है:

can not issue data manipulation statements with executeQuery().

इसका क्या मतलब है?


क्या आपके पास JDBC - MySQL प्रशासक के अलावा अन्य MySQL तक कोई पहुंच है? या कमांड लाइन?
OMG पोनीज़

मेरे पास mysql एडमिन की पहुंच है। हालाँकि अनुरोध ऐसा है। mysql डेटाबेस का उपयोग करके mysql डेटाबेस बनाया जाएगा, संशोधित किया जाएगा, अपडेट किया जाएगा, लेकिन उसके बाद सभी ऑपरेशन जावा के साथ किए जाने की आवश्यकता है।
सिल्वरकिड

JDBC के माध्यम से डेटाबेस बनाने के लिए लिपियों में सूचकांक निर्माण को शामिल करने के लिए बेहतर है, संभावना है कि आपके द्वारा पहले ही उनका उपयोग करने के बाद।
ओएमजी पोनीज

जवाबों:


185

डेटा में हेरफेर करने के लिए आपको वास्तव में आवश्यकता है executeUpdate()बजाय executeQuery()

यहाँ एक executeUpdate()javadoc से अर्क है जो पहले से ही अपने आप में एक उत्तर है:

दिए गए SQL स्टेटमेंट को निष्पादित करता है, जो एक INSERT, UPDATE, या DELETE स्टेटमेंट या एक SQL स्टेटमेंट हो सकता है, जो कि SQL DDL स्टेटमेंट जैसे कुछ भी नहीं लौटाता है।


32

डीएमएल स्टेटमेंट को निष्पादित करते समय, आपको इसके बजाय executeUpdate/ का उपयोग करना चाहिए ।executeexecuteQuery

यहाँ एक संक्षिप्त तुलना है:

executeQueryVSexecuteUpdateVSexecute


19

यदि आप स्प्रिंग बूट का उपयोग कर रहे हैं, तो बस एक @ टिप्पणी जोड़ें।

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

2
स्प्रिंग बूट रिपॉजिटरी में स्टेटमेंट डिलीट करने के लिए
@ ट्रान्सैकटेशनल

1
codar.club/blogs/5cd7f06bec80a.html संशोधन, लेन-देन और क्वेरी एनोटेशन के उपयोग की व्याख्या करता है। मैंने अपनी समस्या का उपयोग करके हल किया: @Modifying(clearAutomatically = true) @Transactionalमेरी डिलीट क्वेरी को परिभाषित करने वाले @Query एनोटेशन के ठीक ऊपर
user666

16

executeUpdate()डेटा हेरफेर स्टेटमेंट जारी करने के लिए उपयोग करें । executeQuery()केवल चयनित प्रश्नों के लिए है (अर्थात परिणाम सेट करने वाले प्रश्न)।


12

डिलीट क्वेरी के लिए - उपयोग करें @Modifyingऔर @Transactionalइस @Queryतरह से पहले : -

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

}

यह java.sql.SQLException: Can not issue data manipulation statements with executeQuery()त्रुटि नहीं देगा ।



4

यह कोड मेरे लिए काम करता है: मैं मानों को एक INSERT को सफेद करता हूं और इस मूल्य के LAST_INSERT_ID () का चयन करता हूं; मैं java NetBeans 8.1, MySql और 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()एक रिटर्न ResultSet। मैं Java / MySQL से उतना परिचित नहीं हूँ, लेकिन अनुक्रमणिका बनाने के लिए जो आप शायद चाहते हैं executeUpdate()


2
यह एक उम्मीद नहीं है ResultSet। यह बजाय रिटर्न एक ResultSet
बालुसक

2
यह डीबी से निर्धारित परिणाम की उम्मीद करता है कि मेरा क्या मतलब है।
नील एन

2
@Modifying
@Transactional
@Query(value = "delete from cart_item where cart_cart_id=:cart", nativeQuery = true)
public void deleteByCart(@Param("cart") int cart); 

@Query से पहले @Modifying और @Transnational जोड़ना न भूलें। इससे मेरा काम बनता है।

जेपीए के साथ देशी क्वेरी का उपयोग करके कुछ शर्त के साथ रिकॉर्ड को हटाने के लिए उपर्युक्त एनोटेशन महत्वपूर्ण हैं।


-1

कोष्ठक पर निष्पादित करें () के अलावा, आपको SQL कथन का उपयोग करने के लिए एक चर भी जोड़ना होगा।

उदाहरण के लिए:

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

हैलो! शीर्षकों के रूप में, स्टैक ओवरफ्लो पर प्रश्न और उत्तर अंग्रेजी में लिखे जाने चाहिए (अन्यथा वे विलोपन और / या अनुवाद के जोखिम को चलाते हैं)। चीयर्स! ( ! होला कोमो लास Cabezas पैरा arriba, लास Preguntas y respuestas स्टैक ओवरफ़्लो डेबे estar escrito एन इन्ग्लेस (डी लो contrario corren एल riesgo de eliminación y / o Google Traductor sobre) ¡Salud।! )
क्रिस Forrence
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.