69675


`@Query`で`nativeQuery=true`にして`update`文を作ったところ実行時に、下記のようなエラーが出ました。  
どのようにすれば解決できますか？

[code]

    2020-08-19 10:16:19.739  WARN 76089 --- [nio-8080-exec-7] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: S1009
    2020-08-19 10:16:19.739 ERROR 76089 --- [nio-8080-exec-7] o.h.engine.jdbc.spi.SqlExceptionHelper   : Can not issue data manipulation statements with executeQuery().
    2020-08-19 10:16:19.756 ERROR 76089 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.orm.jpa.JpaSystemException: could not extract ResultSet; nested exception is org.hibernate.exception.GenericJDBCException: could not extract ResultSet] with root cause
    
    java.sql.SQLException: Can not issue data manipulation statements with executeQuery().
            at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
            at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
            at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
            at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
            at com.mysql.cj.jdbc.StatementImpl.checkForDml(StatementImpl.java:367)
    以下略
    
[/code]


CC BY-SA 4.0
2020-08-19T01:29:41.260
69674
2020-08-19T01:43:05.903
2020-08-19T01:43:05.903
9008
9008
question
java spring kotlin spring-boot
Can not issue data manipulation statements with executeQuery() が出る


<https://stackoverflow.com/a/55682350/1979953>

にヒントがありました。回答は次の通り

> If you're using spring boot, just add an @Modifying annotation.
[code]

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

またこの回答には次のコメントがついています。

<https://stackoverflow.com/a/55682350/1979953>

> for delete statement in spring boot repository @Transactional will help

たしかに `@Transactional` を付けないと下記のようなエラーとなってしまいました。

[code]

    2020-08-19 10:24:32.517 ERROR 76220 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query] with root cause
    
    javax.persistence.TransactionRequiredException: Executing an update/delete query
            at org.hibernate.internal.AbstractSharedSessionContract.checkTransactionNeededForUpdateOperation(AbstractSharedSessionContract.java:413)
            at org.hibernate.query.internal.AbstractProducedQuery.executeUpdate(AbstractProducedQuery.java:1608)
            at org.springframework.data.jpa.repository.query.JpaQueryExecution$ModifyingExecution.doExecute(JpaQueryExecution.java:238)
            at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:88)
            at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:154)
            at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:142)
    以下略
    
[/code]

上記エラーメッセージをよくみると、`Executing an update/delete query`
とありますので、`update`のときも`@Transactional`を付けないといけないようです。

よって

[code]

    @Transactional
    @Modifying
    @Query(
        value = "update .....",
        nativeQuery = true
    )
    
[/code]

のような書き方で動きます。

`@Transactional`と`@Modifying`は結局同時につけないといけないようです。  
もしサービス等で`@Transactional`を付与した場合は、リポジトリ側の方が無視されると下記に言及がありました。

[java - Do we need both @Transactional and @Modifying annotation in Spring? -
Stack Overflow](https://stackoverflow.com/questions/48314475/do-we-need-both-
transactional-and-modifying-annotation-in-spring)


CC BY-SA 4.0
2020-08-19T01:29:41.260
69675
2020-08-19T01:29:41.260
9008
69674
answer