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

BalusC
источник
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 (т.е. запросов, возвращающих набор результатов).

OMG Пони
источник
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! )
Крис Форренс