###実現したいこと
書籍を参考に、「Spring Data JPA」を使用し、データを取得する学習をしています。Spring初学者です。
SQLファイルでデータ挿入後、JPQLでデータ抽出を行いたいのですが、エラーが発生してしまい、詰まってしまっています。
###起こっている現象
H2DBを使用し、「Customerクラス」をエンティティ化、「CustomerRepositoryリポジトリクラス」を作成し、
テーブルを自動生成するようにしました。
エントリ・ポイントにインサートするデータを記述し、そのデータを抽出するところまではできたのですが
「JPQL」でクエリの定義(定義されていない検索処理の定義)をし、指示通り記述変更後、src/main/resources配下に「data.sql」を配置し
CustomerRepositoryクラスに変更を加えると、エラーが発生します。
###変更前ソースコード
Customer
1package com.example.hajibootjpa.domain; 2 3import lombok.AllArgsConstructor; 4import lombok.Data; 5import lombok.NoArgsConstructor; 6 7import javax.persistence.*; 8 9@Entity 10@Table(name = "customers") 11@Data 12@NoArgsConstructor 13@AllArgsConstructor 14public class Customer { 15 @Id 16 @GeneratedValue 17 private Integer id; 18 @Column(nullable = false) 19 private String firstName; 20 @Column(nullable = false) 21 private String lastName; 22}
CustomerRepository
1package com.example.hajibootjpa.repository; 2 3import com.example.hajibootjpa.domain.Customer; 4import org.springframework.data.jpa.repository.JpaRepository; 5import org.springframework.data.jpa.repository.Query; 6 7import java.util.List; 8 9public interface CustomerRepository extends JpaRepository<Customer, Integer> { 10 11} 12
HajibootJpaApplication
1package com.example.hajibootjpa; 2 3import com.example.hajibootjpa.domain.Customer; 4import com.example.hajibootjpa.repository.CustomerRepository; 5import org.springframework.beans.factory.annotation.Autowired; 6import org.springframework.boot.CommandLineRunner; 7import org.springframework.boot.SpringApplication; 8import org.springframework.boot.autoconfigure.SpringBootApplication; 9import org.springframework.data.domain.Page; 10import org.springframework.data.domain.PageRequest; 11import org.springframework.data.domain.Pageable; 12 13@SpringBootApplication 14public class HajibootJpaApplication implements CommandLineRunner { 15 16 @Autowired 17 CustomerRepository customerRepository; 18 19 @Override 20 public void run(String... strings) throws Exception { 21 22 Customer created = customerRepository.save(new Customer(null, "Hidetoshi", "Dekisugi")); 23 24 25 26 System.out.println(created + "is created!"); 27 28 customerRepository.findAllOrderByName().forEach(System.out::println); 29 } 30 31 public static void main(String[] args) { 32 SpringApplication.run(HajibootJpaApplication.class, args); 33 } 34}
applicationProperties
1spring.datasource.driver-class-name=net.sf.log4jdbc.DriverSpy 2spring.datasource.url=jdbc:log4jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE 3spring.datasource.username=sa 4spring.datasource.password= 5 6logging.level.jdbc=OFF 7logging.level.jdbc.sqltiming=DEBUG
###変更後ソースコード(dataは、src/main/resources配下に配置しています)とエラーコード
CustomerRepository
1package com.example.hajibootjpa.repository; 2 3import com.example.hajibootjpa.domain.Customer; 4import org.springframework.data.jpa.repository.JpaRepository; 5import org.springframework.data.jpa.repository.Query; 6 7import java.util.List; 8 9public interface CustomerRepository extends JpaRepository<Customer, Integer> { 10 @Query("SELECT x FROM Customer x ORDER BY x.firstName, x.lastName") 11 List<Customer> findAllOrderByName(); 12}
data
1insert into customers(first_name, last_name) values('Nobita', 'Nobi'); 2insert into customers(first_name, last_name) values('Takeshi', 'Goda'); 3insert into customers(first_name, last_name) values('Suneo', 'Honekawa'); 4insert into customers(first_name, last_name) values('shizuka', 'Minamoto');
2021-09-02 21:33:22.296[0;39m [32m INFO[0;39m [35m6384[0;39m [2m---[0;39m [2m[ main][0;39m [36mc.e.hajibootjpa.HajibootJpaApplication [0;39m [2m:[0;39m Starting HajibootJpaApplication using Java 16.0.2 on kawamuraseiyanoMacBook-Pro.local with PID 6384 (/Users/kawamuraseiya/Desktop/practiceSpring/hajiboot-jpa/target/classes started by kawamuraseiya in /Users/kawamuraseiya/Desktop/practiceSpring/hajiboot-jpa) [2m2021-09-02 21:33:22.298[0;39m [32m INFO[0;39m [35m6384[0;39m [2m---[0;39m [2m[ main][0;39m [36mc.e.hajibootjpa.HajibootJpaApplication [0;39m [2m:[0;39m No active profile set, falling back to default profiles: default [2m2021-09-02 21:33:22.634[0;39m [32m INFO[0;39m [35m6384[0;39m [2m---[0;39m [2m[ main][0;39m [36m.s.d.r.c.RepositoryConfigurationDelegate[0;39m [2m:[0;39m Bootstrapping Spring Data JPA repositories in DEFAULT mode. [2m2021-09-02 21:33:22.676[0;39m [32m INFO[0;39m [35m6384[0;39m [2m---[0;39m [2m[ main][0;39m [36m.s.d.r.c.RepositoryConfigurationDelegate[0;39m [2m:[0;39m Finished Spring Data repository scanning in 33 ms. Found 1 JPA repository interfaces. [2m2021-09-02 21:33:22.880[0;39m [32m INFO[0;39m [35m6384[0;39m [2m---[0;39m [2m[ main][0;39m [36mcom.zaxxer.hikari.HikariDataSource [0;39m [2m:[0;39m HikariPool-1 - Starting... [2m2021-09-02 21:33:23.019[0;39m [32m INFO[0;39m [35m6384[0;39m [2m---[0;39m [2m[ main][0;39m [36mcom.zaxxer.hikari.pool.PoolBase [0;39m [2m:[0;39m HikariPool-1 - Driver does not support get/set network timeout for connections. (Receiver class net.sf.log4jdbc.ConnectionSpy does not define or inherit an implementation of the resolved method 'abstract int getNetworkTimeout()' of interface java.sql.Connection.) [2m2021-09-02 21:33:23.026[0;39m [32m INFO[0;39m [35m6384[0;39m [2m---[0;39m [2m[ main][0;39m [36mcom.zaxxer.hikari.HikariDataSource [0;39m [2m:[0;39m HikariPool-1 - Start completed. [2m2021-09-02 21:33:23.046[0;39m [31mERROR[0;39m [35m6384[0;39m [2m---[0;39m [2m[ main][0;39m [36mjdbc.sqltiming [0;39m [2m:[0;39m com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:94) 1. insert into customers(first_name, last_name) values('Nobita', 'Nobi') {FAILED after 0 msec} org.h2.jdbc.JdbcSQLSyntaxErrorException: テーブル "CUSTOMERS" が見つかりません Table "CUSTOMERS" not found; SQL statement: insert into customers(first_name, last_name) values('Nobita', 'Nobi') [42102-200] at org.h2.message.DbException.getJdbcSQLException(DbException.java:453) ~[h2-1.4.200.jar:1.4.200] at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200] at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.200.jar:1.4.200] at org.h2.message.DbException.get(DbException.java:181) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.readTableOrView(Parser.java:7628) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.readTableOrView(Parser.java:7599) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.parseInsert(Parser.java:1747) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.parsePrepared(Parser.java:954) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.parse(Parser.java:843) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.parse(Parser.java:815) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.prepareCommand(Parser.java:738) ~[h2-1.4.200.jar:1.4.200] at org.h2.engine.Session.prepareLocal(Session.java:657) ~[h2-1.4.200.jar:1.4.200] at org.h2.engine.Session.prepareCommand(Session.java:595) ~[h2-1.4.200.jar:1.4.200] at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1235) ~[h2-1.4.200.jar:1.4.200] at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:212) ~[h2-1.4.200.jar:1.4.200] at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:201) ~[h2-1.4.200.jar:1.4.200] at net.sf.log4jdbc.StatementSpy.execute(StatementSpy.java:839) ~[log4jdbc-remix-0.2.7.jar:na] at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:94) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java) ~[HikariCP-4.0.3.jar:na] at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:261) ~[spring-jdbc-5.3.9.jar:5.3.9] at
###考えられること
「data.sql」が先に読み込まれてしまい、H2DBがテーブルを生成する前にinsertしようとしていることが原因ではないのだろうかと
考えています(data/sql配置前はしっかり動作していたため)
どなたかご教授いただけないでしょうか
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/03 04:30 編集