前提
O/RマッパーであるSpring Data JDBCを用いてJavaから入力したデータをMySQLデータベースへ挿入したいと考えています。save()メソッドを用いてInsertを実行したいのですが、save()メソッドは主キーがnullのでない場合、updateになってしまいます。しかし、主キーの値をnullでは挿入できないため、Insertのみを実行するメソッドを作成したいのですが、”クエリは結果を返却しませんでした。”とエラーメッセージが発生してしまいます。
実現したいこと
- O/RマッパーはSpring Data JDBCを用いたい
- @Queryを用いてInsertのみを実行するメソッドを実行したい
発生している問題・エラーメッセージ
Exception in thread "restartedMain" java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) Caused by: org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [INSERT INTO sample VALUES(?, ?)]; クエリは結果を返却しませんでした。; nested exception is org.postgresql.util.PSQLException: クエリは結果を返却しませんでした。 at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79) at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1541) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:667) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:713) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:738) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:794) at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:243) at org.springframework.data.jdbc.repository.query.AbstractJdbcQuery.lambda$singleObjectQuery$1(AbstractJdbcQuery.java:120) at org.springframework.data.jdbc.repository.query.StringBasedJdbcQuery.execute(StringBasedJdbcQuery.java:136) at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:160) at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:139) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) at com.sun.proxy.$Proxy80.InsertData(Unknown Source) at com.example.demo.service.SampleServiceImpl.InsertOnly(SampleServiceImpl.java:16) at com.example.demo.SpringDataJdbcSampleApplication.executeInsertOnly(SpringDataJdbcSampleApplication.java:33) at com.example.demo.SpringDataJdbcSampleApplication.execute(SpringDataJdbcSampleApplication.java:26) at com.example.demo.SpringDataJdbcSampleApplication.main(SpringDataJdbcSampleApplication.java:16) ... 5 more Caused by: org.postgresql.util.PSQLException: クエリは結果を返却しませんでした。 at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:120) at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:722) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:651) ... 30 more
該当のソースコード
SampleCrudRepository.java
1package com.example.demo.repository; 2 3import org.springframework.data.jdbc.repository.query.Query; 4import org.springframework.data.repository.CrudRepository; 5import org.springframework.data.repository.query.Param; 6 7import com.example.demo.entity.Sample; 8 9public interface SampleCrudRepository extends CrudRepository<Sample, Integer> { 10 // 主キー”id”と”name”に値を代入するメソッド 11 @Query(value = "INSERT INTO sample VALUES(:id, :name)") 12 void InsertData(@Param("id") Integer id, @Param("name") String name); 13 14 // データベース内に入っているデータを見るメソッド 15 @Query("SELECT * FROM sample order by id") 16 Iterable<Sample> findAllOrderASC(); 17}
Sample.java
1package com.example.demo.entity; 2 3import org.springframework.data.annotation.Id; 4 5import lombok.AllArgsConstructor; 6import lombok.Data; 7import lombok.NoArgsConstructor; 8 9@Data 10@NoArgsConstructor 11@AllArgsConstructor 12public class Sample { 13 @Id 14 private Integer id; 15 private String name; 16}
SpringDataJdbcSample.java
1package com.example.demo; 2 3import org.springframework.beans.factory.annotation.Autowired; 4import org.springframework.boot.SpringApplication; 5import org.springframework.boot.autoconfigure.SpringBootApplication; 6 7import com.example.demo.entity.Sample; 8import com.example.demo.repository.SampleCrudRepository; 9import com.example.demo.service.SampleService; 10 11@SpringBootApplication 12public class SpringDataJdbcSampleApplication { 13 14 public static void main(String[] args) { 15 SpringApplication.run(SpringDataJdbcSampleApplication.class, args) 16 .getBean(SpringDataJdbcSampleApplication.class).execute(); 17 } 18 19 @Autowired 20 SampleCrudRepository repository; 21 22 private void execute() { 23 executeInsertOnly(); 24 executeSelect(); 25 } 26 // @Queryで作成したメソッドの実行(InsertData()) 27 private void executeInsertOnly() { 28 repository.InsertData(2, "Takahashi"); 29 } 30 31 // @Queryで作成したメソッドの実行(findAllOrderASC()) 32 private void executeSelect() { 33 System.out.println("---全件取得します---"); 34 Iterable<Sample> members = repository.findAllOrderASC(); 35 for (Sample member : members) { 36 System.out.println(member); 37 } 38 } 39}
試したこと
Insertのみを実行するメソッドを作成しました。
@Query(value = "INSERT INTO sample VALUES(:id, :name)") void InsertData(@Param("id") Integer id, @Param("name") String name);
補足情報(FW/ツールのバージョンなど)
Spring boot ver2.7.4
MySQL ver8.0.31
作成したDB(sampleDB)
Sample
1CREATE TABLE SAMPLE( 2 id INT PRIMARY KEY NOT NULL, 3 name VARCHAR(45) NOT NULL);

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/10/18 10:27