ไม่สามารถออกคำสั่งการจัดการข้อมูลด้วย executeQuery ()


100

ใน MySQL ฉันมีสองตารางtableAและtableB. ฉันกำลังพยายามดำเนินการสองคำสั่ง:

executeQuery(query1) 
executeQuery(query2)

แต่ฉันได้รับข้อผิดพลาดต่อไปนี้:

can not issue data manipulation statements with executeQuery().

สิ่งนี้หมายความว่า?


คุณมีสิทธิ์เข้าถึง MySQL นอกเหนือจาก JDBC - MySQL Administrator หรือไม่ หรือบรรทัดคำสั่ง?
OMG Ponies

ฉันมีสิทธิ์เข้าถึงผู้ดูแลระบบ mysql อย่างไรก็ตามความต้องการเป็นเช่นนั้น ฐานข้อมูล mysql จะถูกสร้างแก้ไขปรับปรุงและอื่น ๆ โดยใช้ mysql admin แต่หลังจากนั้นการดำเนินการทั้งหมดจะต้องทำด้วย java
silverkid

ดีกว่าที่จะรวมการสร้างดัชนีในสคริปต์เพื่อสร้างฐานข้อมูลมากกว่าผ่าน JDBC ซึ่งน่าจะเป็นไปได้หลังจากที่คุณใช้งานได้แล้ว
OMG Ponies

คำตอบ:


191

การจัดการกับข้อมูลที่คุณต้องการจริงมากกว่าexecuteUpdate()executeQuery()

นี่คือสารสกัดจากexecuteUpdate()javadoc ซึ่งมีคำตอบอยู่แล้ว:

เรียกใช้คำสั่ง SQL ที่กำหนดซึ่งอาจเป็นคำสั่ง INSERT, UPDATE หรือ DELETE หรือคำสั่ง SQL ที่ไม่ส่งคืนค่าใด ๆ เช่นคำสั่ง SQL DDL


37

เมื่อดำเนินการคำสั่ง DML คุณควรใช้executeUpdate/ มากกว่าexecuteexecuteQuery

นี่คือการเปรียบเทียบสั้น ๆ :

executeQueryVSexecuteUpdateVSexecute


25

หากคุณใช้สปริงบูตให้เพิ่มคำอธิบายประกอบ @Modifying

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

3
สำหรับคำสั่งลบในที่เก็บสปริงบูต @Transactional จะช่วย
Abhishek Chudekar

1
codar.club/blogs/5cd7f06bec80a.htmlอธิบายการใช้งานการปรับเปลี่ยนคำอธิบายประกอบธุรกรรมและแบบสอบถาม ฉันแก้ไขปัญหาของฉันโดยใช้: @Modifying(clearAutomatically = true) @Transactionalเหนือคำอธิบายประกอบ @Query ที่กำหนดคำค้นหาการลบของฉัน
user666

17

สำหรับ Delete query - ใช้@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()ข้อผิดพลาด

แก้ไข:

เนื่องจากคำตอบนี้ได้รับคะแนนโหวตจำนวนมากฉันจึงขอแนะนำให้คุณดูเอกสารประกอบเพื่อความเข้าใจมากขึ้น

@ การทำธุรกรรม

By default, CRUD methods on repository instances are transactional. For read operations, 
the transaction configuration readOnly flag is set to true. 
All others are configured with a plain @Transactional so that default transaction 
configuration applies.

@ การปรับเปลี่ยน

Indicates a query method should be considered as modifying query as that changes the way 
it needs to be executed. This annotation is only considered if used on query methods defined 
through a Query annotation). It's not applied on custom implementation methods or queries 
derived from the method name as they already have control over the underlying data access 
APIs or specify if they are modifying by their name.

Queries that require a @Modifying annotation include INSERT, UPDATE, DELETE, and DDL 
statements.

16

ใช้executeUpdate()เพื่อออกงบการจัดการข้อมูล executeQuery()มีไว้สำหรับคำสั่ง SELECT เท่านั้น (เช่นแบบสอบถามที่ส่งคืนชุดผลลัพธ์)



4

รหัสนี้ใช้ได้กับฉัน: ฉันตั้งค่าเล็กน้อยเป็น INSERT และรับ LAST_INSERT_ID () ของค่านี้เป็น SELECT; ฉันใช้ 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
@Modifying
@Transactional
@Query(value = "delete from cart_item where cart_cart_id=:cart", nativeQuery = true)
public void deleteByCart(@Param("cart") int cart); 

อย่าลืมใส่ @Modifying และ @Transnational ก่อน @query มันได้ผลสำหรับฉัน

ในการลบบันทึกที่มีเงื่อนไขบางอย่างโดยใช้การสืบค้นแบบเนทีฟกับ JPA คำอธิบายประกอบที่กล่าวถึงข้างต้นมีความสำคัญ


3

executeQuery()ส่งคืน a ResultSet. ฉันไม่คุ้นเคยกับ Java / MySQL แต่ในการสร้างดัชนีคุณอาจต้องการไฟล์executeUpdate().


2
ไม่คาดหวังResultSet. แทนที่จะส่งกลับไฟล์ResultSet.
BalusC

2
คาดว่าชุดผลลัพธ์จาก DB คือสิ่งที่ฉันหมายถึง
Neil N

-2

นอกจาก executeUpdate () บนวงเล็บแล้วคุณยังต้องเพิ่มตัวแปรเพื่อใช้คำสั่ง SQL

ตัวอย่างเช่น:

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

สวัสดี! โปรดทราบว่าคำถามและคำตอบใน Stack Overflow จะต้องเขียนเป็นภาษาอังกฤษ (มิฉะนั้นจะเสี่ยงต่อการถูกลบและ / หรือการแปลโดย Google) ไชโย! ( 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 Elinación y / o Google Traductor) ¡ Salud! )
Chris Forrence
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.