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

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

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

Javadocは、Java言語で記述されたクラスライブラリ、及びアプリケーションについてのパッケージ・クラス・メソッドのHTML形式のAPI仕様書のことを指します。ドキュメント更新の漏れを減らすことができ、最新の状態を把握することが可能になります。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

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

Spring Boot

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

Q&A

解決済

1回答

1476閲覧

Spring Date JPAを使用した更新のエラーの解決方法が知りたいです

enenken

総合スコア3

Javadoc

Javadocは、Java言語で記述されたクラスライブラリ、及びアプリケーションについてのパッケージ・クラス・メソッドのHTML形式のAPI仕様書のことを指します。ドキュメント更新の漏れを減らすことができ、最新の状態を把握することが可能になります。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

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

Spring Boot

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

0グッド

0クリップ

投稿2023/03/20 06:46

実現したいこと

更新機能の実装をしたい

前提

tymeleaf
Spring Boot
Spring data JPA
等を使い社員情報管理システムを作成しております.
更新機能を実装中に以下のエラーが発生いたしました.

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

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'indexController': Unsatisfied dependency expressed through field 'empRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeRepository' defined in jp.co.sss.sys.repository.EmployeeRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract jp.co.sss.sys.entity.Employee jp.co.sss.sys.repository.EmployeeRepository.saveEmpName(java.lang.String,java.lang.String,int)! Reason: Failed to create query for method public abstract jp.co.sss.sys.entity.Employee jp.co.sss.sys.repository.EmployeeRepository.saveEmpName(java.lang.String,java.lang.String,int)! No property saveEmpName found for type Employee!; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract jp.co.sss.sys.entity.Employee jp.co.sss.sys.repository.EmployeeRepository.saveEmpName(java.lang.String,java.lang.String,int)! No property saveEmpName found for type Employee!

該当のソースコード

EmployeeRepository.java

1package jp.co.sss.sys.repository; 2import org.springframework.data.jpa.repository.JpaRepository; 3import org.springframework.stereotype.Repository; 4import org.springframework.transaction.annotation.Transactional; 5import jp.co.sss.sys.entity.Employee; 6/** 7 * リポジトリークラス 8 * 9 * 10 */ 11@Transactional 12@Repository 13 14public interface EmployeeRepository extends JpaRepository<Employee, String> { 15 16 Employee findByEmpIdAndPassword(String empId, String password); 17 18 Employee saveEmpName(String empName, String password, int gender); 19} 20

Employee.java

1package jp.co.sss.sys.entity; 2import java.util.Date; 3import javax.persistence.Column; 4import javax.persistence.Entity; 5import javax.persistence.Id; 6import javax.persistence.Table; 7import javax.validation.constraints.NotEmpty; 8import javax.validation.constraints.Size; 9 10//import org.hibernate.annotations.NamedQuery; 11/** 12 * エンティティクラス 13 * 14 * 15 */ 16@Entity 17 18@Table(name = "employee") 19public class Employee { 20 21 22 /* 23 * 社員番号 24 */ 25 @Id 26 @Column(name ="emp_id" ) 27 @NotEmpty(message = "社員番号は入力必須項目です") 28 @Size(max = 5, message = "社員番号は5文字以内で入力してください") 29 private String empId; 30 31 @Column (name="emp_name") 32 @NotEmpty(message = "パスワードは入力必須項目です") 33 @Size(max = 16, message = "パスワードは16文字以内で入力してください") 34 private String empName; 35 36 @Column (name="password") 37 private String password; 38 39 @Column (name="birthday") 40 private Date birthday; 41 42 @Column (name="gender") 43 private int gender; 44 45 @Column (name="delete_at") 46 private Boolean delete; 47 48 public void setEmpId(String empId) { 49 this.empId = empId; 50 } 51 public String getEmpId() { 52 return empId; 53 } 54 55 56 public void setEmpName(String empName) { 57 this.empName = empName; 58 } 59 public String getEmpName() { 60 return empName; 61 } 62 63 64 public void setPassword(String password) { 65 this.password = password; 66 } 67 public String getPassword() { 68 return password; 69 } 70 71 72 public void setBirthday(Date birthday) { 73 this.birthday = birthday; 74 } 75 public Date getBirthday() { 76 return birthday; 77 } 78 79 80 public void setGender(int gender) { 81 this.gender = gender; 82 } 83 public int getGender() { 84 return gender; 85 } 86 87 88 public void setDelete(Boolean delete) { 89 this.delete = delete; 90 } 91 public Boolean getDelete() { 92 return delete; 93 } 94 95 96 97 98 99} 100 101 102 103 104

IndexController.java

1package jp.co.sss.sys.controller; 2import java.text.ParseException; 3import java.util.List; 4 5import javax.servlet.http.HttpServletRequest; 6import javax.servlet.http.HttpServletResponse; 7import javax.servlet.http.HttpSession; 8 9import org.springframework.beans.factory.annotation.Autowired; 10import org.springframework.stereotype.Controller; 11import org.springframework.ui.Model; 12import org.springframework.validation.BindingResult; 13import org.springframework.validation.annotation.Validated; 14import org.springframework.web.bind.annotation.PathVariable; 15import org.springframework.web.bind.annotation.RequestMapping; 16import org.springframework.web.bind.annotation.RequestMethod; 17import org.springframework.web.bind.annotation.SessionAttributes; 18 19import jp.co.sss.sys.entity.Employee; 20import jp.co.sss.sys.form.LoginForm; 21import jp.co.sss.sys.repository.EmployeeRepository; 22 23/** 24 * コントローラークラス 25 * 26 * 27 */ 28 29@Controller 30@SessionAttributes(types = Employee.class) 31public class IndexController { 32 33 @Autowired 34 EmployeeRepository empRepository; 35 LoginForm loginform; 36 37 /** 38 * ログイン画面を表示する 39 * @param loginForm 40 * @return login.html 41 */ 42 @RequestMapping(path = "/login", method = RequestMethod.GET) 43 public String login( LoginForm loginForm,BindingResult br,Model model) { 44 return "login"; 45 } 46 @Autowired 47 HttpSession session; 48 49 50 51 // 処理 52 53 54 /** 55 * 入力された値を元にログイン認証し、トップ画面に遷移する 56 * 57 * @param req 58 * @param res 59 * @param loginForm 60 * @return top.html 61 */ 62 @RequestMapping(path = "/top", method = RequestMethod.POST) 63 public String login(@Validated LoginForm loginForm, HttpServletRequest req, HttpServletResponse res,BindingResult br,Model model,HttpSession session) { 64 //ログインした人の情報 65 String empId = req.getParameter("empId"); 66 String password = req.getParameter("password"); 67 68 69 Employee employee = empRepository.findByEmpIdAndPassword(empId, password); 70 71 //セッションデータ設定 72 session.setAttribute("userInfo",employee); 73 //ログインユーザー情報 74 model.addAttribute("employee",employee); 75 76 //ログインチェック 77 if(employee == null) { 78 //存在しない場合 79 return "login"; 80 81 }else { 82 83 //存在した場合 84 //社員情報一覧 85 List<Employee> empAll= empRepository.findAll(); 86 model.addAttribute("empAll",empAll); 87 88 89 90 91 return "top"; 92 93 } 94 } 95 96 @RequestMapping(path = "/top", method = RequestMethod.GET) 97 public String top(@Validated LoginForm loginForm, HttpServletRequest req, HttpServletResponse res,BindingResult br,Model model,HttpSession session) { 98 List<Employee> empAll= empRepository.findAll(); 99 model.addAttribute("empAll",empAll); 100 101 return "top"; 102 103 } 104 105 106 107 //ユーザー更新入力情報 th:object empPost 108 @RequestMapping(path = "/mypage", method = RequestMethod.POST) 109 public String empUser(@Validated @PathVariable("emp_id")LoginForm loginForm, HttpServletRequest req, HttpServletResponse res,BindingResult br,Model model,HttpSession session) throws ParseException { 110 session = req.getSession(); 111 112 String empName = req.getParameter("empName"); 113 String password = req.getParameter("password"); 114 115 String savegender = req.getParameter("gender"); 116 117 int gender = Integer.parseInt(savegender); 118 119 120// 121 122 123 124 125 126 Employee updateEmployee=empRepository.saveEmpName(empName,password,gender); 127 128 return "edit_fin"; 129 130 131 } 132 // Employee updateEmployee = empRepository.saveAll(savegender, savegender, null, gender); 133 134 135 //ログインユーザー情報 136 137 138 139 140 141 142 //マイページリンク押下,既存情報の出力 143 @RequestMapping(path = "/mypage", method = RequestMethod.GET) 144 public String empLink(@Validated LoginForm loginForm, HttpServletRequest req, HttpServletResponse res,BindingResult br,Model model,HttpSession session) { 145 session = req.getSession(); 146 Object userInfo=session.getAttribute("userInfo"); 147 model.addAttribute("userInfo",userInfo); 148 149 150 151 152 153 154 155 156 return "mypage"; 157 158 159 } 160 161} 162 163 164 165 166 167 168 169 170 171 172 173

mypage.html

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head> 4<meta charset="UTF-8" /> 5<link th:href="@{/css/style.css}" rel="stylesheet" /> 6<link th:href="@{/css/layout.css}" rel="stylesheet" /> 7<title>マイページ変更・確認画面</title> 8</head> 9<body> 10 <!-- ヘッダー --> 11 12 <header th:include="layout/header :: head"> 13 14 15 </header> 16 17 <!-- サイドバー --> 18 <aside th:include="layout/aside :: side"></aside> 19 <!-- メイン --> 20 <article class="mypage"> 21 <form action="" th:action="@{/mypage}" th:field="${userUpdate}" 22 method="post"> 23 <h3 class="page_title">マイページ変更・確認画面</h3> 24 25 26 <table class="table employee"> 27 28 <tr th:each="userInfo : ${userInfo}" th:object="${userInfo}"> 29 <tr> 30 <th class="cell_title">社員番号</th> 31 <td th:text="*{userInfo.empId}"></td> 32 </tr> 33 <tr> 34 <th class="cell_title">名前</th> 35 <td><input type="text" name="empName" 36 th:value="${userInfo.empName}" /></td> 37 38 </tr> 39 <tr> 40 <th class="cell_title">パスワード</th> 41 <td><input type="password" name="password" 42 th:value="${userInfo.password}" /></td> 43 44 </tr> 45 <tr> 46 <th class="cell_title">生年月日</th> 47 <td><input type="text" name="birthday" 48 th:value="${userInfo.birthday}" /></td> 49 50 </tr> 51 <tr> 52 <th class="cell_title">性別</th> 53 <td><input type="radio" name="gender" 54 th:value="${userInfo.gender}" 55 th:switch="*{userInfo.gender == 1}" 56 th:checked="${userInfo.gender == 1}" /> 男 <input type="radio" 57 name="gender" th:switch="*{userInfo.gender == 2}" 58 th:checked="${userInfo.gender == 2}"> 女</td> 59 60 61 </tr> 62 </table> 63 <div class="btn_area_center"> 64 <input type="submit" value="変更確定" class="btn"> 65 </div> 66 </form> 67 </article> 68 <!-- フッダー --> 69 <footer th:include="layout/footer :: foot"></footer> 70 71</body> 72</html>

試したこと

IndexController.javaとEmployeeRepository.java内にあります,
saveEmpNameメソッドの引数を変更,
saveEmpNameメソッドのメソッド名の変更
⇨元々save()でした

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

Java SE 16
eclipce 2022

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

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

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

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

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

guest

回答1

0

ベストアンサー

発生している問題は、EmployeeRepositoryインターフェイスで定義されているsaveEmpNameメソッドが、Spring Data JPAによって認識されないためです。saveEmpNameメソッドの目的は、Employeeエンティティの名前、パスワード、および性別を更新することですが、Spring Data JPAはリポジトリインターフェイスからクエリメソッドを生成する際に、メソッド名に基づいてクエリを生成します。しかし、saveEmpNameという名前のメソッドは、Employeeエンティティのプロパティと一致しないため、エラーが発生しています。

この問題を解決するには、EmployeeRepositoryインターフェイスでsaveEmpNameメソッドを定義する代わりに、JpaRepositoryで提供されるsaveメソッドを使用して、Employeeエンティティを更新できます。以下は、修正後のIndexControllerのempUserメソッドの例です。

java

1@RequestMapping(path = "/mypage", method = RequestMethod.POST) 2public String empUser(@Validated @PathVariable("emp_id")LoginForm loginForm, HttpServletRequest req, HttpServletResponse res,BindingResult br,Model model,HttpSession session) throws ParseException { 3 session = req.getSession(); 4 5 String empName = req.getParameter("empName"); 6 String password = req.getParameter("password"); 7 8 String savegender = req.getParameter("gender"); 9 int gender = Integer.parseInt(savegender); 10 11 Employee userInfo = (Employee) session.getAttribute("userInfo"); 12 userInfo.setEmpName(empName); 13 userInfo.setPassword(password); 14 userInfo.setGender(gender); 15 16 Employee updateEmployee = empRepository.save(userInfo); 17 18 return "edit_fin"; 19}

ここで行った変更点は、次のとおりです。

  1. 番号リストEmployeeRepositoryからsaveEmpNameメソッドを削除し、代わりにsaveメソッドを使用します。
  2. セッションからEmployeeオブジェクト(userInfo)を取得し、入力された名前、パスワード、および性別を設定します。
  3. 番号リスト更新されたEmployeeオブジェクトをsaveメソッドに渡して、データベースに保存します。
  4. この変更により、EmployeeRepositoryのsaveEmpNameメソッドが不要になり、エラーが解決されるはずです。

投稿2023/03/20 07:32

komagata

総合スコア19

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

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

enenken

2023/03/22 01:23

とてもわかりやすいご返答でした!無事挙動も確認できました ありがとうございます! また何かありましたら宜しくお願い致します.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.53%

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

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

質問する

関連した質問