

編集画面で更新したい内容に値を変え、実行ボタンを押すと "No value present"
といったエラーが表示されてしまうため、こちらの改善を行いたいです。

以下のサイトを参考にしてSpring bootでの更新を行おうと考えています。

[SpringBoot入門 vol.14：編集と削除機能を追加しよう](https://learning-
collection.com/springboot%e5%85%a5%e9%96%80-vol-14%ef%bc%9a%e7%b7%a8%e9%9b%86%e3%81%a8%e5%89%8a%e9%99%a4%e6%a9%9f%e8%83%bd%e3%82%92%e8%bf%bd%e5%8a%a0%e3%81%97%e3%82%88%e3%81%86/)

こちらのサイトはテーブルが一つの更新ですが、私が行いたいのは二つのテーブルを同時に更新できるものです。そこの違いでもしかしたらアクシデントが起きているのかもしれませんが、いまいち原因を突き止められません。  
ご教授いただけませんでしょうか。

**コントロールクラス**

[code]

      @PostMapping("search")
      public String index(
          @RequestParam String id,
          @RequestParam String name,
          @RequestParam String kana,
          @ModelAttribute CreateForm createForm,
          @Validated @ModelAttribute SearchForm searchForm,
          BindingResult result,
          Model model,
          HttpServletRequest request) {
        List<Userdetail> search = equipmentRepository.find(id, name, kana);
        BeanUtils.copyProperties(createForm, search);
        HttpSession session = request.getSession();
        session.setAttribute("search", search);
        model.addAttribute("search", search);
        if (result.hasErrors()) {
          return "search";
        }
        return "searchout";
      }
    
    @PostMapping(path = "update", params = "update")
      String update(@RequestParam String id, @ModelAttribute CreateForm createForm) {
        Optional<User> opt = sevi.selectById(id);
        User u = opt.get();
        BeanUtils.copyProperties(u, createForm);
        return "update";
      }
    
      @PostMapping(path = "update", params = "back")
      String back() {
        return "redirect:/";
      }
    
      @PostMapping(path = "update", params = "regist")
      //ポイント2
      String regist(@RequestParam String id, @Validated @ModelAttribute CreateForm createForm, BindingResult result,Model model) {
          if (result.hasErrors()) {
              return update(id, createForm);
          }
          User user = new User();
          //Userdetail userdetail = new Userdetail();
          BeanUtils.copyProperties(createForm, user);
         // BeanUtils.copyProperties(createForm, userdetail);
          sevi.update(user);
          //sevi.updatee(userdetail);
        model.addAttribute("searchForm", new SearchForm());
          return "search";
      }
    
[/code]

メソッドindexあたりから自分は二つのテーブルを使いだしました。  
下はリポジトリクラスに記載しているメソッドindexで使っている  
equipmentRepository.findの中身です。

[code]

        @Query("SELECT DISTINCT e FROM Userdetail e INNER JOIN e.user WHERE e.user.id LIKE CONCAT(:id,'%') and e.user.name LIKE CONCAT(:name,'%') and e.user.kana LIKE CONCAT(:kana,'%') ORDER BY e.id")
        List<Userdetail> find(@Param("id") String id,
            @Param("name") String name,
            @Param("kana") String kana);
    
[/code]

**テーブル**

[code]

    @Entity
    @Table(name="user")
    @Getter
    @Setter
    @AllArgsConstructor
    @NoArgsConstructor
    public class User implements Serializable {
    
      @Id
      @Column(name="id")
    
      //@GeneratedValue(strategy=GenerationType.IDENTITY)
      private String id;
    
      @Column(name = "pass")
      private String pass;
      @Column(name = "name")
      private String name;
      @Column(name = "kana")
      private String kana;
    
      @OneToMany(mappedBy="user", cascade=CascadeType.ALL)
      private List<Userdetail> userdetail;
    
    }
    
[/code]

[code]

    @Entity
    @Table(name="userdetail")
    @Getter
    @Setter
    @AllArgsConstructor
    @NoArgsConstructor
    public class Userdetail implements Serializable{
      @Id
      @GeneratedValue(strategy=GenerationType.AUTO)
      private int no;
      private String id;
      private String birth;
      private String club;
      @ManyToOne
      @JoinColumn(name = "ID",insertable = false, updatable = false)
      private User user;
    }
    
[/code]

**編集画面(update.html)**

[code]

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
    <!-- scripts import -->
    <script th:src="@{/webjars/jquery/3.5.1/jquery.min.js}"></script>
    <script
        th:src="@{/webjars/bootstrap/4.4.1-1/js/bootstrap.bundle.min.js}"></script>
    <!-- style import -->
    <link th:href="@{/webjars/bootstrap/4.4.1-1/css/bootstrap.css}"
        rel="stylesheet" />
    <link th:href="@{/css/login.css}" rel="stylesheet" />
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <div class="col-sm-5">
            <div class="page-header">
                <h1>編集画面</h1>
            </div>
            <form th:action="@{/update}" th:object="${createForm}" method="post">
                <table class="table table-bordered table-hover">
                    <!-- ユーザーID -->
                    <tr>
                        <th class="active col-sm-3">ユーザID</th>
                                <td><input type="text" class="form-control" name="id"
                                    th:field="*{id}"
                                    th:classappend="${#fields.hasErrors('id')} ? 'is-invalid'">
                                <span class="text-danger" th:if="${#fields.hasErrors('id')}"
                                    th:errors="*{id}"></span></td>
                    </tr>
                    <!-- 名前 -->
                    <tr>
                        <th class="active">名前</th>
                        <td>
                                <input type="text" class="form-control" name="name"
                                    th:field="*{name}"
                                    th:classappend="${#fields.hasErrors('name')} ? 'is-invalid'">
                                <span class="text-danger" th:if="${#fields.hasErrors('name')}"
                                    th:errors="*{name}"></span>
                        </td>
                    </tr>
                    <!-- カナ -->
                    <tr>
                        <th class="active">カナ</th>
                        <td>
                                <input type="text" class="form-control" name="kana"
                                    th:field="*{kana}"
                                    th:classappend="${#fields.hasErrors('kana')} ? 'is-invalid'">
                                <span class="text-danger" th:if="${#fields.hasErrors('kana')}"
                                    th:errors="*{kana}"></span>
                        </td>
                    </tr>
                    <!-- 生年月日 -->
                    <tr>
                        <th class="active">生年月日(yyyy/mm/dd)</th>
                        <td>
                                <input type="text" class="form-control" name="birth"
                                    th:field="*{birth}"
                                    th:classappend="${#fields.hasErrors('birth')} ? 'is-invalid'">
                                <span class="text-danger" th:if="${#fields.hasErrors('birth')}"
                                    th:errors="*{birth}"></span>
                        </td>
                    </tr>
                    <!-- 委員会 -->
                    <tr>
                        <th class="active">委員会</th>
                        <td>
                                <input type="text" class="form-control" name="club"
                                    th:field="*{club}"
                                    th:classappend="${#fields.hasErrors('club')} ? 'is-invalid'">
                                <span class="text-danger" th:if="${#fields.hasErrors('club')}"
                                    th:errors="*{club}"></span>
                        </td>
                    </tr>
                </table>
                <input type="submit" class="btn btn-outline-dark mt-3" name="back" value="戻る">
                <input type="submit" class="btn btn-primary mt-3" name="regist" value="実行">
                <input type="hidden" name="id" th:value="${param.id[0]}">
            </form>
        </div>
    
    </body>
    </html>
    
[/code]

**編集画面(update.html)に遷移するまえのsearchout.html**

[code]

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
    <meta charset="utf-8" />
    <title>検索画面</title>
    </head>
    <body>
        <h2>社員情報検索</h2>
        <h3>※前方一致で検索します</h3>
        <form action="#" th:action="@{/search}" th:object="${searchForm}"
            method="post">
            <table>
                <tr>
                    <td>id: <input type="text" name="id" th:field="*{id}" /><br>
                        <span th:if="${#fields.hasErrors('id')}" th:errors="*{id}"></span>
                    </td>
                </tr>
                <tr>
                    <td>名前:<input type="text" name="name" th:field="*{name}" /><br>
                        <span th:if="${#fields.hasErrors('name')}" th:errors="*{name}"></span>
                    </td>
                </tr>
                <tr>
                <tr>
                    <td>カナ:<input type="text" name="kana" th:field="*{kana}" /><br>
                        <span th:if="${#fields.hasErrors('kana')}" th:errors="*{kana}"></span>
                    </td>
                </tr>
                <tr>
                    <td><button type="submit">検索</button></td>
                </tr>
            </table>
        </form>
        <button type="submit" class="btn btn--blue"
            onClick="location.href='http://localhost:8080/create'">新規登録</button>
    
        <table>
            <tr>
                <th>ID</th>
                <th>名前</th>
                <th>カナ</th>
                <th>生年月日</th>
                <th>委員会</th>
                <th>操作</th>
            </tr>
            <tr th:each="search:${search}">
                <td th:text="${search.user.id}">
                <td th:text="${search.user.name}">
                <td th:text="${search.user.kana}">
                <td th:text="${search.birth}">
                <td th:text="${search.club}">
                <td>
                    <form th:action="@{/update}" method="post">
                        <input type="submit" name="update" value="編集">
                        <input type="hidden" name="birth" th:value="${search.birth}"> <!-- ←これするとupdate.htmlに遷移したとき-->
                        <input type="hidden" name="club" th:value="${search.club}">   <!-- テキストボックスに文字はいる-->
                        <input type="hidden" name="id" th:value="${search.user.id}">
                    </form>
                </td>
                <td>
                    <form th:action="@{/delete}" method="post">
                        <input type="submit" name="delete" value="削除">
                        <input type="hidden" name="id" th:value="${search.user.id}">
                    </form>
                </td>
        </table>
    </body>
    </html>
    
[/code]

**サービスクラス**

[code]

      public void update(User user) {
        userRepository.save(user);
      }
      public void updatee(Userdetail userdetail) {
        userdetailRepository.save(userdetail);
      }
    
[/code]

**searchout.htmlからupdate.htmlに遷移したさいのupdate.html画面**

値が初めから入っている仕様です

[![画像の説明をここに入力](https://i.stack.imgur.com/vnJgu.png)](https://i.stack.imgur.com/vnJgu.png)  
[![画像の説明をここに入力][2]][2]


CC BY-SA 4.0
2021-11-06T04:40:27.660
83449
2021-11-06T16:22:30.033
2021-11-06T06:08:52.413
3060
48204
question
java mysql spring spring-boot
Springで更新を行った際にでてくるNo value presentといったエラーを改善したい


> "No value present" といったエラー

これは
[`Optional#get()`](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/Optional.html#get\(\))
メソッドを実行し、値が無かった場合に送出される `NoSuchElementException` のメッセージだと思います。

このメソッドを利用しているのは、質問コード中では1箇所なので、該当の例外はここで発生していると考えます(違うのであれば、その旨質問文に追記してください):

[code]

    @PostMapping(path = "update", params = "update")
      String update(@RequestParam String id, @ModelAttribute CreateForm createForm) {
        Optional<User> opt = sevi.selectById(id);
        User u = opt.get();
        BeanUtils.copyProperties(u, createForm);
        return "update";
      }
    
[/code]

`sevi.selectById(id)` は、おそらく、`id` をキーにした `User` 検索で、該当する `User`
がいない場合に空になるのでしょう。

該当する `User` がいた場合にだけ処理するには次のような実装になります:

[code]

        Optional<User> opt = sevi.selectById(id);
        opt.ifPresent(u -> BeanUtils.copyProperties(u, createForm));
        return "update";
    
[/code]

参考: [Java Optional (Google
検索結果)](https://www.google.com/search?q=Java+Optional&lr=lang_ja)


CC BY-SA 4.0
2021-11-06T16:22:30.033
83456
2021-11-06T16:22:30.033
2808
83449
answer