Không thể đưa ra các câu lệnh thao tác dữ liệu với executeQuery ()


97

Trong MySQL, tôi có hai bảng tableAtableB. Tôi đang cố gắng thực hiện hai truy vấn:

executeQuery(query1) 
executeQuery(query2)

Nhưng tôi gặp lỗi sau:

can not issue data manipulation statements with executeQuery().

Điều đó có nghĩa là gì?


Bạn có bất kỳ quyền truy cập nào vào MySQL ngoài JDBC - Quản trị viên MySQL không? Hay dòng lệnh?
OMG Ponies

tôi có quyền truy cập vào quản trị viên mysql. tuy nhiên yêu cầu là như vậy. cơ sở dữ liệu mysql sẽ được tạo, sửa đổi, cập nhật, v.v. bằng cách sử dụng quản trị viên mysql nhưng sau đó tất cả các hoạt động được yêu cầu thực hiện với java.
silverkid

Tốt hơn nên bao gồm việc tạo chỉ mục trong các tập lệnh để tạo cơ sở dữ liệu hơn là thông qua JDBC, có thể là sau khi bạn có thể đã sử dụng chúng.
OMG Ponies

Câu trả lời:


185

Để thao tác dữ liệu bạn thực sự cần executeUpdate()hơn là executeQuery().

Đây là một đoạn trích từ executeUpdate()javadoc đã là một câu trả lời của riêng nó:

Thực thi câu lệnh SQL đã cho, có thể là câu lệnh INSERT, UPDATE hoặc DELETE hoặc câu lệnh SQL không trả về gì, chẳng hạn như câu lệnh SQL DDL.


32

Khi thực hiện câu lệnh DML, bạn nên sử dụng executeUpdate/ executethay vì executeQuery.

Đây là một so sánh ngắn gọn:

executeQueryVSexecuteUpdateVSexecute


19

Nếu bạn đang sử dụng khởi động mùa xuân, chỉ cần thêm chú thích @Modizing.

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

2
cho tuyên bố xóa trong khởi động mùa xuân kho @Transactional sẽ giúp đỡ
Abhishek Chudekar

1
codar.club/blogs/5cd7f06bec80a.html giải thích việc sử dụng các chú thích sửa đổi, giao dịch và truy vấn. Tôi giải quyết vấn đề của tôi sử dụng: @Modifying(clearAutomatically = true) @Transactionalngay trên chú thích @Query định truy vấn xóa của tôi
user666

16

Sử dụng executeUpdate()để đưa ra các câu lệnh thao tác dữ liệu. executeQuery()chỉ dành cho các truy vấn SELECT (tức là các truy vấn trả về một tập kết quả).


12

Đối với truy vấn Xóa - Sử dụng @Modifying@Transactionaltrước những thứ @Querytương tự: -

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

}

Nó sẽ không đưa ra java.sql.SQLException: Can not issue data manipulation statements with executeQuery()lỗi.



4

Mã này phù hợp với tôi: Tôi đặt các giá trị bằng INSERT và nhận được LAST_INSERT_ID () của giá trị này khi chọn; Tôi sử dụng java NetBeans 8.1, MySql và 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()trả về a ResultSet. Tôi không phải là quen thuộc với Java / MySQL, nhưng để tạo ra các chỉ số có thể bạn muốn một executeUpdate().


2
Nó không mong đợi a ResultSet. Thay vào đó, nó trả về a ResultSet.
BalusC

2
Ý tôi là nó mong đợi một tập kết quả từ DB.
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); 

Đừng quên thêm @Modify và @Transnational trước @query. nó hoạt động cho tôi.

Để xóa bản ghi với một số điều kiện bằng cách sử dụng truy vấn gốc với JPA, các chú thích được đề cập ở trên là quan trọng.


-1

Ngoài executeUpdate () trên dấu ngoặc đơn, bạn cũng phải thêm một biến để sử dụng câu lệnh SQL.

Ví dụ:

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

Xin chào! Lưu ý, các câu hỏi và câu trả lời trên Stack Overflow phải được viết bằng tiếng Anh (nếu không chúng có nguy cơ bị xóa và / hoặc Google Dịch). Chúc mừng! ( 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 de deción y / o Google Traductor). ¡Salud! )
Chris Forrence 23/03/15
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.