В 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.
При выполнении инструкции DML вы должны использовать executeUpdate
/execute
, а не executeQuery
.
Вот краткое сравнение:
Используйте executeUpdate()
для выдачи операторов манипулирования данными. executeQuery()
предназначен только для запросов SELECT (т.е. запросов, возвращающих набор результатов).
Вот для чего executeUpdate
.
Вот очень краткое изложение различий: http://www.coderanch.com/t/301594/JDBC/java/Difference-between-execute-executeQuery-executeUpdate
Если вы используете весеннюю загрузку, просто добавьте аннотацию @Modifying.
@Modifying
@Query
(value = "UPDATE user SET middleName = 'Mudd' WHERE id = 1", nativeQuery = true)
void updateMiddleName();
Этот код работает для меня: я устанавливаю значения с 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;}
ExecuteQuery ожидает набор результатов. Я не так хорошо знаком с Java/MySQL, но для создания индексов вам, вероятно, нужен ExecuteUpdate().
Для запроса на удаление - используйте @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()
.
Помимо executeUpdate() в круглых скобках, вы также должны добавить переменную для использования оператора SQL.
Например:
PreparedStatement pst = connection.prepareStatement(sql);
int numRowsChanged = pst.executeUpdate(sql);