Não é possível emitir instruções de manipulação de dados com executeQuery ()


97

No MySQL, tenho duas tabelas tableAe tableB. Estou tentando executar duas consultas:

executeQuery(query1) 
executeQuery(query2)

Mas recebo o seguinte erro:

can not issue data manipulation statements with executeQuery().

O que isto significa?


Você tem algum acesso ao MySQL que não seja via JDBC - MySQL Administrator? Ou linha de comando?
Pôneis OMG

Eu tenho acesso ao administrador do mysql. no entanto, o requisito é tal. o banco de dados mysql será criado, modificado, atualizado, etc. usando mysql admin, mas depois disso, todas as operações devem ser feitas com java.
silverkid

Melhor incluir a criação de índice em scripts para criar o banco de dados do que via JDBC, provavelmente depois de já ter usado.
Pôneis OMG

Respostas:


185

Para manipular dados, você realmente precisa executeUpdate()ao invés de executeQuery().

Aqui está um extrato do executeUpdate()javadoc que já é uma resposta por si só:

Executa a instrução SQL fornecida, que pode ser INSERT, UPDATE ou DELETE ou uma instrução SQL que não retorna nada, como uma instrução SQL DDL.


32

Ao executar a instrução DML, você deve usar executeUpdate/ em executevez de executeQuery.

Aqui está uma breve comparação:

executeQueryVSexecuteUpdateVSexecute


19

Se você estiver usando uma bota de mola, basta adicionar uma anotação @Modifying.

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

2
para instrução de exclusão na inicialização Primavera repositório vontade @Transactional ajuda
Abhishek Chudekar

1
codar.club/blogs/5cd7f06bec80a.html explica o uso de anotações modificadoras, transacionais e de consulta. @Modifying(clearAutomatically = true) @TransactionalResolvi meu problema usando: logo acima da anotação @Query que define minha consulta de exclusão
user666

16

Use executeUpdate()para emitir instruções de manipulação de dados. executeQuery()destina-se apenas a consultas SELECT (ou seja, consultas que retornam um conjunto de resultados).


12

Para Excluir consulta - Use @Modifyinge @Transactionalantes @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);

}

Não vai dar o java.sql.SQLException: Can not issue data manipulation statements with executeQuery()erro.



4

Este código funciona para mim: eu defino valores com um INSERT e obtenho o LAST_INSERT_ID () deste valor com um SELECT; Eu uso java NetBeans 8.1, MySql e 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()retorna a ResultSet. Não estou tão familiarizado com Java / MySQL, mas para criar índices você provavelmente deseja um executeUpdate().


2
Não espera um ResultSet. Em vez disso, retorna um ResultSet.
BalusC de

2
Ele espera um conjunto de resultados do banco de dados é o que quero dizer.
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); 

Não se esqueça de adicionar @Modifying e @Transnational antes de @query. funciona para mim.

Para excluir o registro com alguma condição usando consulta nativa com JPA, as anotações mencionadas acima são importantes.


-1

Além de executeUpdate () nos parênteses, você também deve adicionar uma variável para usar uma instrução SQL.

Por exemplo:

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

Olá! Como um aviso, perguntas e respostas no Stack Overflow devem ser escritas em inglês (caso contrário, correrão o risco de exclusão e / ou tradução do Google). Felicidades! ( Hola! Como las cabezas para arriba, las preguntas and respuestas sobre Stack Overflow debe estar escrito em Inglês (de lo contrario corren el riesgo de eliminação y / o Google Traductor). ¡Salud! )
Chris Forrence,
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.