executeQuery()ではデータ操作ステートメントを発行できません


97

MySQLには2つのテーブルがtableAありtableBます。2つのクエリを実行しようとしています。

executeQuery(query1) 
executeQuery(query2)

しかし、私は次のエラーを受け取ります:

can not issue data manipulation statements with executeQuery().

これは何を意味するのでしょうか?


JDBC-MySQL Administrator以外の方法でMySQLにアクセスできますか?またはコマンドライン?
OMGポニー

mysql adminへのアクセス権があります。ただし、要件は次のとおりです。mysqlデータベースは、mysql adminを使用して作成、変更、更新などされますが、その後はすべての操作がjavaで実行される必要があります。
silverkid 2009

JDBCを使用するよりも、データベースを作成するためのスクリプトにインデックス作成を含める方が良いでしょう。
OMGポニー

回答:


185

executeUpdate()ではなく、実際に必要なデータを操作するにはexecuteQuery()

executeUpdate()これは、それ自体ですでに回答となっているjavadoc からの抜粋です。

INSERT、UPDATE、DELETEステートメント、またはSQL DDLステートメントなど、何も返さないSQLステートメントである可能性がある、指定されたSQLステートメントを実行します。


32

DMLステートメントを実行するときは、executeUpdate/ executeではなく/ を使用する必要がありますexecuteQuery

ここに簡単な比較があります:

executeQueryVSexecuteUpdateVSexecute


19

Spring Bootを使用している場合は、@ Modifyingアノテーションを追加するだけです。

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


1
codar.club/blogs/5cd7f06bec80a.htmlは、変更、トランザクション、クエリアノテーションの使用法を説明しています。私は使用して問題を解決しました: @Modifying(clearAutomatically = true) @Transactional削除クエリを定義する@Queryアノテーションのすぐ上
user666 '26

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で値を設定し、SELECTでこの値のLAST_INSERT_ID()を取得します。私は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 2009

2
それは私が意味するものはDBからの結果セットであることを期待しています。
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); 

@queryの前に@Modifyingと@Transnationalを追加することを忘れないでください。わたしにはできる。

JPAのネイティブクエリを使用して、ある条件でレコードを削除するには、上記の注釈が重要です。


-1

括弧のexecuteUpdate()の他に、SQLステートメントを使用するには変数を追加する必要もあります。

例えば:

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

こんにちは!ヘッドアップとして、Stack Overflowの質問と回答は英語で記述する必要があります(そうしないと、削除やGoogle翻訳のリスクが発生します)。乾杯!(Hola!Como las cabezas para arriba、las preguntas y respuestas sobre Stack Overflow debe estar escrito enInglés(de lo contrario corren el riesgo deeliminacióny / o Google Traductor)
。¡Salud
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.