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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Spring Boot

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

Q&A

解決済

1回答

8914閲覧

Springビルド失敗 (No property goalSeq found for type Meisai!)

chocolate_pie

総合スコア26

Spring Boot

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

0グッド

0クリップ

投稿2019/12/16 07:51

編集2019/12/17 01:14

前提・実現したいこと

DBのデータを表示する機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

上からCaused byが4つありましたので記します。

エラーメッセージ ①Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'meisaiService': Unsatisfied dependency expressed through field 'repository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'meisaiRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract jp.co.itc.mbo.entity.Meisai jp.co.itc.mbo.repository.MeisaiRepository.findByGoalSeq(jp.co.itc.mbo.entity.GoalSeq)! No property goalSeq found for type Meisai! ②Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'meisaiRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract jp.co.itc.mbo.entity.Meisai jp.co.itc.mbo.repository.MeisaiRepository.findByGoalSeq(jp.co.itc.mbo.entity.GoalSeq)! No property goalSeq found for type Meisai! ③Caused by: java.lang.IllegalArgumentException: Failed to create query for method public abstract jp.co.itc.mbo.entity.Meisai jp.co.itc.mbo.repository.MeisaiRepository.findByGoalSeq(jp.co.itc.mbo.entity.GoalSeq)! No property goalSeq found for type Meisai! ④Caused by: org.springframework.data.mapping.PropertyReferenceException: No property goalSeq found for type Meisai!

該当のソースコード

エンティティ

java

1 2Meisai.java 3@Entity 4@Table(name = "meisai_tbl") 5public class Meisai { 6 7 @Id 8 @Column(name = "meisai_id") 9 @GeneratedValue(strategy = GenerationType.IDENTITY) 10 private int meisaiid; 11 12 @OneToOne(targetEntity = GoalSeq.class) 13 @JoinColumn(name = "goalseq_id") 14 private GoalSeq goalseqid; 15

java

1GoalSeq.java 2@Entity 3@Table(name="goals_seq") 4public class GoalSeq { 5 @Id 6 @Column(name="id") 7 @GeneratedValue(strategy = GenerationType.IDENTITY)//自動採番 8 private int id; 9 10 @OneToOne(mappedBy = "goalseqid", cascade = CascadeType.ALL) 11 private Meisai meisai; 12//useridをユーザマスタエンティティから参照していますがユーザマスタエンティティの記述は省略します 13 @ManyToOne(targetEntity = UserMaster.class) 14 @JoinColumn(nullable = false, name = "user_id") 15 private UserMaster userid;

リポジトリ

java

1MeisaiRepository.java 2@Repository 3public interface MeisaiRepository extends JpaRepository<Meisai, Integer> { 4 public Meisai findByGoalSeq(GoalSeq goalseq); 5}

java

1GoalSeqRepository.java 2@Repository 3public interface GoalSeqRepository extends JpaRepository<GoalSeq,Integer>{ 4 @Query(value="SELECT * FROM goals_seq where delete_flg=false and user_id=:ID order by goal_id DESC ",nativeQuery = true) 5 public List <GoalSeq> findCurrent(@Param("ID")int userid); 6}

サービス

java

1MeisaiService.java 2 3@Service 4public class MeisaiService { 5 //1目標ごとに紐づけられているmeisai_tblの情報をとってくる 6 public Meisai findByGoalSeq(GoalSeq goalseq) { 7 return repository.findByGoalSeq(goalseq); 8 } 9 10 public Meisai save(Meisai meisai) { 11 return repository.save(meisai); 12 } 13 }

java

1GoalSeqService.java 2@Service 3public class GoalSeqService { 4 5 //有効なuseridが含まれるレコードをとってくる 6 public List<GoalSeq> findCurrent(int userid) { 7 return repository.findCurrent( userid); 8 9 public GoalSeq save(GoalSeq goalseq) { 10 return repository.save(goalseq); 11 } 12}

コントローラー

java

1@Controller 2public class DisplayController { 3@Autowired 4 GoalSeqService goalseqservice; 5 @Autowired 6 MeisaiService meisaiservice; 7@Autowired 8 UserMasterService usermasterservice; 9 @RequestMapping("/{id}") //idはユーザのIDだよ 10 public String showGoal(@PathVariable int id, Model model) { 11 12 //ユーザ情報の取得 13 UserMaster usermaster = usermasterservice.findOne(id); 14 15 16 //自分の目標内容とウェイトを表示す 17 int userid = usermaster.getId(); 18 List<GoalSeq> goalseqs = goalseqservice.findCurrent(userid); 19 model.addAttribute("goalseqs", goalseqs); 20 21 //本人、上長コメントを表示する 22 Meisai meisai0 = meisaiservice.findByGoalSeq(goalseqs.get(0)); 23 Meisai meisai1 = meisaiservice.findByGoalSeq(goalseqs.get(1)); 24 Meisai meisai2 = meisaiservice.findByGoalSeq(goalseqs.get(2)); 25 Meisai meisai3 = meisaiservice.findByGoalSeq(goalseqs.get(3)); 26 Meisai meisai4 = meisaiservice.findByGoalSeq(goalseqs.get(4)); 27 28 model.addAttribute("meisai0", meisai0); 29 model.addAttribute("meisai1", meisai1); 30 model.addAttribute("meisai2", meisai2); 31 model.addAttribute("meisai3", meisai3); 32 model.addAttribute("meisai4", meisai4); 33 34 return "goals/goal_list"; 35 36 } 37 38} 39 40

12/17追記 Goalseq goalseqidに関するものを以下に修正しました。
が、同じようなエラーが出てしまいました。

エラー文 Caused by: org.springframework.data.mapping.PropertyReferenceException: No property goalSeq found for type Meisai! Did you mean 'goalseq'?

java

1エンティティ 2Meisaiエンティティ 3@OneToOne(targetEntity = GoalSeq.class) 4 @JoinColumn(name = "goalseq_id") 5 private GoalSeq goalseq; 6 7GoalSeqエンティティ 8@OneToOne(mappedBy = "goalseq", cascade = CascadeType.ALL) 9 private Meisai meisai;

java

1Meisaiリポジトリ 2public interface MeisaiRepository extends JpaRepository<Meisai, Integer> { 3 4 public Meisai findByGoalSeq(GoalSeq goalseq); 5}

java

1Meisaiサービス 2 public Meisai findByGoalSeq(GoalSeq goalseq) { 3 return repository.findByGoalSeq(goalseq); 4 }

試したこと

・OneToOneの書き方が間違っていないか確認した
・MeisaiサービスとリポジトリのfindByGoalSeq変数が含まれるところをコメントアウトしたらビルドが通るが、コメントアウトした部分のデータを取る書き方が分からず困った。

補足情報(FW/ツールのバージョンなど)

DB定義情報です。
Meisai_tbl
イメージ説明
goals_seq
イメージ説明

goals_seqのidをMeisaiのgoalseq_idに紐づけたいです。
数時間調べても分かりませんでした、初心者で至らない部分が多数ありますがよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

このエラーメッセージの通り、Meisai型にgoalSeqというプロパティ(フィールド)が見つからないことが原因です。

No property goalSeq found for type Meisai!

下記のようにMeisaiRepositoryにfindByGoalSeqというメソッドを定義した場合、

Java

1@Repository 2public interface MeisaiRepository extends JpaRepository<Meisai, Integer> { 3 public Meisai findByGoalSeq(GoalSeq goalseq); 4}

MeisaiにGoalSeq型のgoalSeqというプロパティ(フィールド)が定義されている必要がありますが、実際にはGoalSeq型のプロパティはgoalseqidとなっています。

Java

1@OneToOne(targetEntity = GoalSeq.class) 2@JoinColumn(name = "goalseq_id") 3private GoalSeq goalseqid;

上記のことから、解決方法は2つ考えられますが、個人的には1番目の解決方法が妥当だと思います。

  1. MeisaiのGoalSeq型プロパティ名をgoalSeqにリネームする。
  2. MeisaiRepositoryのメソッド名をfindByGoalseqidにリネームする。

追記

質問内容から分かる範囲で再現した、双方のエンティティクラスでOneToOneアノテーションを付与した、双方向の関連を持つコードです。
下記の環境で動作確認できています。

  • OpenJDK 11.0
  • Spring Boot 2.2.1
  • Hibernate Core 5.1.0
  • MySQL 8.0.17

Java

1import java.util.Date; 2 3import javax.persistence.CascadeType; 4import javax.persistence.Column; 5import javax.persistence.Entity; 6import javax.persistence.GeneratedValue; 7import javax.persistence.GenerationType; 8import javax.persistence.Id; 9import javax.persistence.OneToOne; 10import javax.persistence.Table; 11 12@Entity 13@Table(name = "goals_seq") 14public class GoalSeq { 15 16 @Id 17 @GeneratedValue(strategy = GenerationType.IDENTITY) 18 private Long id; 19 20 @Column 21 private Long userId; 22 23 @Column 24 private Long goalId; 25 26 @Column 27 private String goalTitle; 28 29 @Column 30 private String goalDetail; 31 32 @Column 33 private String goalWeight; 34 35 @Column 36 private Date updatedAt; 37 38 @OneToOne(mappedBy = "goalSeq", cascade = CascadeType.ALL) 39 private Meisai meisai; 40 41 public Long getId() { 42 return id; 43 } 44 45 public void setId(Long id) { 46 this.id = id; 47 } 48 49 public Long getUserId() { 50 return userId; 51 } 52 53 public void setUserId(Long userId) { 54 this.userId = userId; 55 } 56 57 public Long getGoalId() { 58 return goalId; 59 } 60 61 public void setGoalId(Long goalId) { 62 this.goalId = goalId; 63 } 64 65 public String getGoalTitle() { 66 return goalTitle; 67 } 68 69 public void setGoalTitle(String goalTitle) { 70 this.goalTitle = goalTitle; 71 } 72 73 public String getGoalDetail() { 74 return goalDetail; 75 } 76 77 public void setGoalDetail(String goalDetail) { 78 this.goalDetail = goalDetail; 79 } 80 81 public String getGoalWeight() { 82 return goalWeight; 83 } 84 85 public void setGoalWeight(String goalWeight) { 86 this.goalWeight = goalWeight; 87 } 88 89 public Date getUpdatedAt() { 90 return updatedAt; 91 } 92 93 public void setUpdatedAt(Date updatedAt) { 94 this.updatedAt = updatedAt; 95 } 96 97 public Meisai getMeisai() { 98 return meisai; 99 } 100 101 public void setMeisai(Meisai meisai) { 102 this.meisai = meisai; 103 } 104 105 @Override 106 public String toString() { 107 return "GoalSeq [id=" + id + ", userId=" + userId + ", goalId=" + goalId + ", goalTitle=" + goalTitle 108 + ", goalDetail=" + goalDetail + ", goalWeight=" + goalWeight + ", updatedAt=" + updatedAt + "]"; 109 } 110 111}

java

1import javax.persistence.Column; 2import javax.persistence.Entity; 3import javax.persistence.GeneratedValue; 4import javax.persistence.GenerationType; 5import javax.persistence.Id; 6import javax.persistence.JoinColumn; 7import javax.persistence.OneToOne; 8import javax.persistence.Table; 9 10@Entity 11@Table(name = "meisai_tbl") 12public class Meisai { 13 14 @Id 15 @Column(name = "meisai_id") 16 @GeneratedValue(strategy = GenerationType.IDENTITY) 17 private Long meisaiId; 18 19 @Column 20 private String selfMidCmt; 21 22 @Column 23 private String bossMidCmt; 24 25 @Column 26 private String selfEndCmt; 27 28 @Column 29 private String bossEndCmt; 30 31 @OneToOne 32 @JoinColumn(name = "goalseq_id") 33 private GoalSeq goalSeq; 34 35 public Long getMeisaiId() { 36 return meisaiId; 37 } 38 39 public void setMeisaiId(Long meisaiId) { 40 this.meisaiId = meisaiId; 41 } 42 43 public String getSelfMidCmt() { 44 return selfMidCmt; 45 } 46 47 public void setSelfMidCmt(String selfMidCmt) { 48 this.selfMidCmt = selfMidCmt; 49 } 50 51 public String getBossMidCmt() { 52 return bossMidCmt; 53 } 54 55 public void setBossMidCmt(String bossMidCmt) { 56 this.bossMidCmt = bossMidCmt; 57 } 58 59 public String getSelfEndCmt() { 60 return selfEndCmt; 61 } 62 63 public void setSelfEndCmt(String selfEndCmt) { 64 this.selfEndCmt = selfEndCmt; 65 } 66 67 public String getBossEndCmt() { 68 return bossEndCmt; 69 } 70 71 public void setBossEndCmt(String bossEndCmt) { 72 this.bossEndCmt = bossEndCmt; 73 } 74 75 public GoalSeq getGoalSeq() { 76 return goalSeq; 77 } 78 79 public void setGoalSeq(GoalSeq goalSeq) { 80 this.goalSeq = goalSeq; 81 } 82 83 @Override 84 public String toString() { 85 return "Meisai [meisaiId=" + meisaiId + ", selfMidCmt=" + selfMidCmt + ", bossMidCmt=" + bossMidCmt 86 + ", selfEndCmt=" + selfEndCmt + ", bossEndCmt=" + bossEndCmt + "]"; 87 } 88 89}

リポジトリ

Java

1import org.springframework.data.jpa.repository.JpaRepository; 2 3import com.example.demo.entity.GoalSeq; 4import com.example.demo.entity.Meisai; 5 6public interface MeisaiRepository extends JpaRepository<Meisai, Long> { 7 public Meisai findByGoalSeq(GoalSeq goalseq); 8}

DDL

SQL

1CREATE TABLE goals_seq ( 2 id BIGINT AUTO_INCREMENT, 3 user_id BIGINT NOT NULL DEFAULT 0, 4 goal_id BIGINT NOT NULL DEFAULT 0, 5 goal_title VARCHAR(255) NULL, 6 goal_detail VARCHAR(255) NULL, 7 goal_weight VARCHAR(10) NULL, 8 updated_at DATE NOT NULL, 9 PRIMARY KEY (id) 10) 11ENGINE = INNODB 12DEFAULT CHARSET = UTF8MB4; 13 14 15CREATE TABLE meisai_tbl ( 16 meisai_id BIGINT AUTO_INCREMENT, 17 goalseq_id BIGINT NOT NULL DEFAULT 0, 18 self_mid_cmt VARCHAR(255) NULL, 19 boss_mid_cmt VARCHAR(255) NULL, 20 self_end_cmt VARCHAR(255) NULL, 21 boss_end_cmt VARCHAR(255) NULL, 22 PRIMARY KEY (meisai_id) 23) 24ENGINE = INNODB 25DEFAULT CHARSET = UTF8MB4;

投稿2019/12/16 13:09

編集2019/12/17 11:32
rubytomato

総合スコア1752

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

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

chocolate_pie

2019/12/17 01:16

ご回答ありがとうございます。1番目の解決方法を試したら同じような下記のエラーが出てしまいました(泣) ソースは、該当ソースコードに追記させていただきました。 Caused by: org.springframework.data.mapping.PropertyReferenceException: No property goalSeq found for type Meisai! Did you mean 'goalseq'?
rubytomato

2019/12/17 01:26

goalseq ではなく goalSeq にしてみてください。
chocolate_pie

2019/12/17 01:58

失礼しました、見間違えてしまいました。goalSeqに変更しましたら、また違ったエラーが出てしまいました…・ Caused by: org.hibernate.AnnotationException: Unknown mappedBy in: jp.co.itc.mbo.entity.GoalSeq.meisai, referenced property unknown: jp.co.itc.mbo.entity.Meisai.goalSeq
rubytomato

2019/12/17 02:01

@OneToOne(mappedBy = "goalseq", cascade = CascadeType.ALL) の goalseq も goalSeq に書き換えてみてください。
chocolate_pie

2019/12/17 02:09

そちらも書き換え済みでエラーが起きてしまいました。OneToOneの記述方法がおかしいのでしょうか…?
rubytomato

2019/12/17 02:24

エンティティクラスのアクセサメソッド(ゲッター/セッター)の名前も修正していますか? まだ、エラーがでるようでしたらエンティティクラス、リポジトリの全文を質問内容に追記してください。
chocolate_pie

2019/12/17 04:25

何度もご丁寧に対応ありがとうございます。 getter,setterも名前を変えたその都度削除して作り直しているので問題はなかったです。 OneToOneの記述をやめ、GoalSeqクエリ内でMeisaiの中身を内部結合をして記述する方法をとったらエラーが解決しました。 ここまでお付き合いくださり誠にありがとうございました。 rubytomatoさんの回答をベストアンサーとさせていただきます。
rubytomato

2019/12/17 11:35

解決できたようでよかったです。 OneToOneアノテーションは結局使えなかったということですが、私の環境で再現したコード上ではOneToOneアノテーションを使った検索は出来ていたので、原因は別のところにあるように思いました。 なにかの参考になればと思い再現コードを追記させて頂きました。
chocolate_pie

2019/12/18 09:20

別の方法で解決したにもかかわらず、丁寧にご編集いただきありがとうございます。 非常に参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問