Невозможно выполнить операторы обработки данных с помощью 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 admin, но после этого все операции должны выполняться с помощью java.
silverkid

Лучше включать создание индекса в сценарии для создания базы данных, чем через JDBC, вероятно, после того, как вы уже могли их использовать.
OMG Ponies

Ответы:


186

Для управления данными вам действительно нужно, executeUpdate()а не executeQuery().

Вот выдержка из executeUpdate()javadoc, которая уже сама по себе является ответом:

Выполняет заданный оператор SQL, который может быть оператором INSERT, UPDATE или DELETE или оператором SQL, который ничего не возвращает, например оператором SQL DDL.


34

При выполнении оператора DML вы должны использовать executeUpdate/ executeвместо executeQuery.

Вот краткое сравнение:

executeQueryVSexecuteUpdateVSexecute


20

Если вы используете весеннюю загрузку, просто добавьте аннотацию @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()возвращает ResultSet. Я не так хорошо знаком с Java / MySQL, но для создания индексов вам, вероятно, понадобится файл executeUpdate().


2
Не ожидает ResultSet. Вместо этого он возвращаетResultSet .
BalusC

2
Я имею в виду, что он ожидает набора результатов из БД.
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); 

Не забудьте добавить @Modifying и @Transnational перед @query. меня устраивает.

Чтобы удалить запись с некоторым условием, используя собственный запрос с JPA, важны упомянутые выше аннотации.


-1

Помимо executeUpdate () в круглых скобках, вы также должны добавить переменную для использования оператора SQL.

Например:

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

Здравствуйте! В качестве заголовка вопросы и ответы о переполнении стека должны быть написаны на английском языке (иначе они могут быть удалены и / или переведены 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 destroyación y / o Google Traductor). ¡Salud! )
Крис Форренс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.