質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

2758閲覧

[SpringBoot] JPAを使用してデータを取得したいがうまくできない

1998Ttf

総合スコア6

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/09/02 12:37

編集2021/09/02 12:43

###実現したいこと
書籍を参考に、「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  INFO 6384 --- [ main] c.e.hajibootjpa.HajibootJpaApplication  : 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) 2021-09-02 21:33:22.298  INFO 6384 --- [ main] c.e.hajibootjpa.HajibootJpaApplication  : No active profile set, falling back to default profiles: default 2021-09-02 21:33:22.634  INFO 6384 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2021-09-02 21:33:22.676  INFO 6384 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 33 ms. Found 1 JPA repository interfaces. 2021-09-02 21:33:22.880  INFO 6384 --- [ main] com.zaxxer.hikari.HikariDataSource  : HikariPool-1 - Starting... 2021-09-02 21:33:23.019  INFO 6384 --- [ main] com.zaxxer.hikari.pool.PoolBase  : 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.) 2021-09-02 21:33:23.026  INFO 6384 --- [ main] com.zaxxer.hikari.HikariDataSource  : HikariPool-1 - Start completed. 2021-09-02 21:33:23.046 ERROR 6384 --- [ main] jdbc.sqltiming  : 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配置前はしっかり動作していたため)

どなたかご教授いただけないでしょうか

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Spring Boot 2.5から、1.data.sql > 2.Hibernate(Spring Data JPA)という初期化順序になりました。(2.4以前は、逆でした)

初期化順序を逆にしたい場合は、以下を設定すると動作するようになります。

properties

1# 初期化順序を、1.Hibernate(Spring Data JPA) > 2.data.sqlにします 2spring.jpa.defer-datasource-initialization=true

公式のドキュメントだと、こちら(基本的な SQL スクリプトを使用してデータベースを初期化する)が参考になります。

投稿2021/09/02 13:47

KT001

総合スコア659

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1998Ttf

2021/09/03 04:30 編集

情報提供ありがとうございます!! 私の場合いただいたコードにプラス、 Customer.javaクラスの「@GeneratedValue」アノテーションの引数に「strategy=GenerationType.IDENTITY」する必要がありました。 改善できました。改めてありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問