executeQuery ()로 데이터 조작 명령문을 발행 할 수 없습니다.


97

MySQL에는 두 개의 테이블 tableA과 tableB. 두 가지 쿼리를 실행하려고합니다.

executeQuery(query1) 
executeQuery(query2)

하지만 다음과 같은 오류가 발생합니다.

can not issue data manipulation statements with executeQuery().

이것은 무엇을 의미 하는가?


JDBC-MySQL 관리자를 통하지 않고 MySQL에 대한 액세스 권한이 있습니까? 아니면 명령 줄?
— OMG Ponies

mysql 관리자에 대한 액세스 권한이 있습니다. 그러나 requiement는 다음과 같습니다. mysql 데이터베이스는 mysql admin을 사용하여 생성, 수정, 업데이트 등을 수행하지만 그 후에는 모든 작업을 java로 수행해야합니다.
— silverkid

JDBC를 사용하는 것보다 데이터베이스를 생성하기 위해 스크립트에 인덱스 생성을 포함하는 것이 좋습니다.
— OMG Ponies

답변:


186

당신이 실제로 필요한 데이터를 조작하기 executeUpdate()보다는를 executeQuery().

다음 executeUpdate()은 이미 그 자체로 대답 인 javadoc 에서 발췌 한 것입니다.

INSERT, UPDATE 또는 DELETE 문이나 아무것도 반환하지 않는 SQL 문 (예 : SQL DDL 문) 일 수있는 지정된 SQL 문을 실행합니다.


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 의지 도움말에서 삭제 문
— Abhishek Chudekar

1
codar.club/blogs/5cd7f06bec80a.html 은 수정, 트랜잭션 및 쿼리 주석의 사용법을 설명합니다. 다음을 사용하여 문제를 해결했습니다. @Modifying(clearAutomatically = true) @Transactional삭제 쿼리를 정의하는 @Query 주석 바로 위에
— user666

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로 값을 설정하고이 값의 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 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 번역의 위험이 있음). 건배! ( ! 안녕 코모 라스 cabezas 파라 아리바는 라스는 Y respuestas은 스택 오버플로 데베 걔 escrito EN 잉글 레스 (드 보라 contrario corren 엘 riesgo 드 eliminación Y / O를 구글 Traductor sobre) preguntas ¡ 건배.! )
— 크리스 Forrence
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.