Не вдається видати оператори маніпулювання даними за допомогою executeQuery ()


97

У MySQL у мене є дві таблиці tableAі tableB. Я намагаюся виконати два запити:

executeQuery(query1) 
executeQuery(query2)

Але я отримую таку помилку:

can not issue data manipulation statements with executeQuery().

Що це означає?


Чи є у вас доступ до MySQL, крім через JDBC - MySQL Administrator? Або командний рядок?
OMG Ponies

я маю доступ до адміністратора mysql. проте потреба така, що. база даних mysql буде створена, модифікована, оновлена ​​тощо за допомогою адміністратора mysql, але після цього всі операції потрібно виконати з java.
silverkid

Краще включати створення індексу до сценаріїв для створення бази даних, ніж через JDBC, ймовірно, після того, як ви вже могли їх використовувати.
OMG Ponies

Відповіді:


185

Для маніпулювання даними вам насправді потрібен, executeUpdate()а не executeQuery().

Ось витяг із executeUpdate()javadoc, який вже є самостійною відповіддю:

Виконує даний оператор SQL, який може бути оператором INSERT, UPDATE або DELETE, або оператором SQL, який нічого не повертає, наприклад оператором SQL DDL.


32

Виконуючи оператор DML, слід використовувати executeUpdate/ executeа не executeQuery.

Ось коротке порівняння:

executeQueryVSexecuteUpdateVSexecute


19

Якщо ви використовуєте весняне завантаження, просто додайте анотацію @Modifying.

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

2
для оператора видалення у весняному сховищі завантаження @Transactional допоможе
Абхішек Чудекар

1
codar.club/blogs/5cd7f06bec80a.html пояснює використання змін, анотацій транзакцій та запитів. Я вирішив свою проблему за допомогою: @Modifying(clearAutomatically = true) @Transactionalтрохи вище анотації @Query, що визначає мій запит на видалення
user666

16

Використовуйте executeUpdate()для видачі заяв про маніпулювання даними. executeQuery()призначений лише для запитів SELECT (тобто запитів, що повертають набір результатів).


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 () цього значення з 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

executeQuery()повертає a ResultSet. Я не настільки знайомий з Java / MySQL, але для створення індексів ви, напевно, хочете executeUpdate().


2
Він не очікує ResultSet. Натомість він повертає a ResultSet.
BalusC

2
Він очікує, що я маю на увазі набір результатів від БД.
Ніл Н

2
@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 важливі вищезазначені анотації.


-1

Окрім executeUpdate () у дужках, ви також повинні додати змінну, щоб використовувати оператор SQL.

Наприклад:

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

Привіт! Як зауваження, запитання та відповіді щодо Stack Overflow мають бути написані англійською мовою (інакше вони ризикують видалити та / або перекласти Google). Ура! ( Привіт! Комо-лас-кабези для приїзду, лас-прегунтації та відповіді на стек переповнення, декрет есріті на англійській мові (протилежний вимогам щодо усунення в Google Traductor). ¡Привітання! )
Кріс Форренс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.