쩨이엠 개발 블로그

Mysql Error : Statement.executeQuery() cannot issue statements that do not produce result sets. 본문

개발/JAVA

Mysql Error : Statement.executeQuery() cannot issue statements that do not produce result sets.

쩨이엠 2024. 5. 21. 18:51
728x90
반응형

 

1. 현상

JpaRepository에서 nativeQuery로 update 쿼리를 실행하던 중 에러가 났다

 

Error 내용

Caused by: java.sql.SQLException: Statement.executeQuery() cannot issue statements that do not produce result sets.
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:130) ~[mysql-connector-j-8.0.33.jar:8.0.33]
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) ~[mysql-connector-j-8.0.33.jar:8.0.33]
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) ~[mysql-connector-j-8.0.33.jar:8.0.33]
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) ~[mysql-connector-j-8.0.33.jar:8.0.33]
	at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:928) ~[mysql-connector-j-8.0.33.jar:8.0.33]
	at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-5.0.1.jar:na]
	at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) ~[HikariCP-5.0.1.jar:na]
	at org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.executeQuery(DeferredResultSetAccess.java:217) ~[hibernate-core-6.1.7.Final.jar:6.1.7.Final]
	... 79 common frames omitted

 

 

2. 원인

이 statements는 result sets을 만들어야한다고 한다

Update를 하는데 굳이 result가 필요한가? 해서 void로 return을 받지 않고 있었는데 혹시 이게 문제인가 해서 int로 return을 받기로 해보았다

역시나 에러가 난다

 

그래서 찾아봄

쿼리마다 실행되는 메소드가 달랐다

 

쿼리 & 메소드

  1. SELECT
    • executeQuery 사용
    • Result set 반환
  2. UPDATE, INSERT, DELETE
    • executeUpdate 사용
    • 해당되는 레코드 갯수를 반환 (int)

 

3. 해결

executeQuery가 사용되었기 때문에 에러가 났다

그러므로 update에 맞는 쿼리를 사용하도록 두 개의 annotation을 붙여준다

 

@Modifying

executeUpdate를 사용하도록 하는 annotation

 

@Transactional

DB 관련 프로세스들을 묶어서 사용할 수 있도록 하는 annotation

 

public interface PurchasesRepository extends JpaRepository<Purchases, Long> {
    @Modifying
    @Transactional
    @Query(value = """
        UPDATE comm_purchases AS p
        JOIN (
            SELECT user_id, lid FROM users
        ) AS a ON a.lid = p.user_lid
        SET p.user_id = a.user_id 
        WHERE p.user_id IS NULL 
        AND p.day >= ?1 AND p.day < ?2
            """, nativeQuery = true)
    void updateLinkPrice(String startDt, String endDt);

   
}

 

annotation 붙인 후 실행하면 잘 돌아가는 것을 확인 할 수 있다.

 

 

728x90
반응형
Comments