개발/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을 받기로 해보았다
역시나 에러가 난다
그래서 찾아봄
쿼리마다 실행되는 메소드가 달랐다
쿼리 & 메소드
- SELECT
- executeQuery 사용
- Result set 반환
- 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
반응형