Impossible d'émettre des instructions de manipulation de données avec executeQuery ()

97

Dans MySQL, j'ai deux tables, tableAet tableB. J'essaye d'exécuter deux requêtes:

executeQuery(query1) 
executeQuery(query2)

Mais j'obtiens l'erreur suivante:

can not issue data manipulation statements with executeQuery().

Qu'est-ce que ça veut dire?

silverkid
la source
Avez-vous un accès à MySQL autre que via JDBC - MySQL Administrator? Ou en ligne de commande?
OMG Ponies
j'ai accès à l'administrateur mysql. cependant la requiement est telle que. la base de données mysql sera créée, modifiée, mise à jour, etc. en utilisant mysql admin mais après cela, toutes les opérations doivent être effectuées avec java.
silverkid
Mieux vaut inclure la création d'index dans les scripts pour créer la base de données que via JDBC, probablement après que vous ayez déjà pu les utiliser.
OMG Ponies

Réponses:

185

Pour manipuler les données dont vous avez réellement besoin executeUpdate()plutôt que executeQuery().

Voici un extrait du executeUpdate()javadoc qui est déjà une réponse en soi:

Exécute l'instruction SQL donnée, qui peut être une instruction INSERT, UPDATE ou DELETE ou une instruction SQL qui ne renvoie rien, telle qu'une instruction SQL DDL.

BalusC
la source
32

Lors de l'exécution d'une instruction DML, vous devez utiliser executeUpdate/ executeplutôt que executeQuery.

Voici une brève comparaison:

executeQueryVSexecuteUpdateVSexecute

Jaskey
la source
19

Si vous utilisez Spring Boot, ajoutez simplement une annotation @Modifying.

@Modifying
@Query
(value = "UPDATE user SET middleName = 'Mudd' WHERE id = 1", nativeQuery = true)
void updateMiddleName();
Forrest
la source
2
pour la déclaration de suppression dans le référentiel de démarrage du printemps @Transactional aidera
Abhishek Chudekar
1
codar.club/blogs/5cd7f06bec80a.html explique l'utilisation des annotations de modification, transactionnelles et de requête. J'ai résolu mon problème en utilisant: @Modifying(clearAutomatically = true) @Transactionaljuste au-dessus de l'annotation @Query définissant ma requête de suppression
user666
16

Utilisez executeUpdate()pour émettre des instructions de manipulation de données. executeQuery()est uniquement destiné aux requêtes SELECT (c'est-à-dire aux requêtes qui renvoient un jeu de résultats).

Poneys OMG
la source
12

Pour la requête Supprimer - Utilisez @Modifyinget @Transactionalavant les éléments @Querysimilaires: -

@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);

}

Cela ne donnera pas l' java.sql.SQLException: Can not issue data manipulation statements with executeQuery()erreur.

Nitin Nanda
la source
4

Ce code fonctionne pour moi: je fixe des valeurs avec un INSERT et j'obtiens le LAST_INSERT_ID () de cette valeur avec un SELECT; J'utilise java NetBeans 8.1, MySql et 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;}
Mati
la source
3

executeQuery()renvoie un ResultSet. Je ne suis pas aussi familier avec Java / MySQL, mais pour créer des index, vous voulez probablement un fichier executeUpdate().

Neil N
la source
2
Il ne s'attend pas à un ResultSet. Il renvoie à la place un ResultSet.
BalusC
2
Il attend un ensemble de résultats de la base de données, c'est ce que je veux dire.
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'oubliez pas d'ajouter @Modifying et @Transnational avant @query. ça marche pour moi.

Pour supprimer l'enregistrement avec certaines conditions en utilisant une requête native avec JPA, les annotations mentionnées ci-dessus sont importantes.

Sunil
la source
-1

Outre executeUpdate () sur les parenthèses, vous devez également ajouter une variable pour utiliser une instruction SQL.

Par exemple:

PreparedStatement pst =  connection.prepareStatement(sql);
int numRowsChanged = pst.executeUpdate(sql);
veloz
la source
salut! En guise d'avertissement, les questions et réponses sur Stack Overflow doivent être rédigées en anglais (sinon elles courent le risque de suppression et / ou de Google Traduction). À votre santé! ( Salut! )
Chris Forrence