ใน MySQL ฉันมีสองตารางtableA
และtableB
. ฉันกำลังพยายามดำเนินการสองคำสั่ง:
executeQuery(query1)
executeQuery(query2)
แต่ฉันได้รับข้อผิดพลาดต่อไปนี้:
can not issue data manipulation statements with executeQuery().
สิ่งนี้หมายความว่า?
ใน MySQL ฉันมีสองตารางtableA
และtableB
. ฉันกำลังพยายามดำเนินการสองคำสั่ง:
executeQuery(query1)
executeQuery(query2)
แต่ฉันได้รับข้อผิดพลาดต่อไปนี้:
can not issue data manipulation statements with executeQuery().
สิ่งนี้หมายความว่า?
คำตอบ:
การจัดการกับข้อมูลที่คุณต้องการจริงมากกว่าexecuteUpdate()
executeQuery()
นี่คือสารสกัดจากexecuteUpdate()
javadoc ซึ่งมีคำตอบอยู่แล้ว:
เรียกใช้คำสั่ง SQL ที่กำหนดซึ่งอาจเป็นคำสั่ง INSERT, UPDATE หรือ DELETE หรือคำสั่ง SQL ที่ไม่ส่งคืนค่าใด ๆ เช่นคำสั่ง SQL DDL
หากคุณใช้สปริงบูตให้เพิ่มคำอธิบายประกอบ @Modifying
@Modifying
@Query
(value = "UPDATE user SET middleName = 'Mudd' WHERE id = 1", nativeQuery = true)
void updateMiddleName();
@Modifying(clearAutomatically = true) @Transactional
เหนือคำอธิบายประกอบ @Query ที่กำหนดคำค้นหาการลบของฉัน
สำหรับ 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.
ใช้executeUpdate()
เพื่อออกงบการจัดการข้อมูล executeQuery()
มีไว้สำหรับคำสั่ง SELECT เท่านั้น (เช่นแบบสอบถามที่ส่งคืนชุดผลลัพธ์)
นั่นคือสิ่งที่executeUpdate
มีไว้สำหรับ
นี่คือบทสรุปสั้น ๆ เกี่ยวกับความแตกต่าง: http://www.coderanch.com/t/301594/JDBC/java/Difference-between-execute-executeQuery-executeUpdate
รหัสนี้ใช้ได้กับฉัน: ฉันตั้งค่าเล็กน้อยเป็น 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;}
@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 คำอธิบายประกอบที่กล่าวถึงข้างต้นมีความสำคัญ
นอกจาก executeUpdate () บนวงเล็บแล้วคุณยังต้องเพิ่มตัวแปรเพื่อใช้คำสั่ง SQL
ตัวอย่างเช่น:
PreparedStatement pst = connection.prepareStatement(sql);
int numRowsChanged = pst.executeUpdate(sql);