83231


部分一致検索ができるwebアプリケーションを作成中です。  
index.htmlは正常に動くのですが、検索ボタンを押しsearch.htmlに遷移しますと何も表示されません。

解決方法、分かる方いましたら教えていただきたいです。

index.htmlは全件表示。  
search.htmlでは部分一致検索の結果が表示されるしようにしたいです。

[code]

    @Controller
    public class DemoController {
      @Autowired //別のクラスを使えるようにしてくれるもの
      EmployeeRepository empRepository;
    
      @RequestMapping(value = "/", method = RequestMethod.GET)
      public String index(Model model) {
        List<Employee> emplist = empRepository.findAll();
        model.addAttribute("employeelist", emplist);
        return "index";
      }
    
      @GetMapping("/search")
      public ModelAndView search(@RequestParam String empname, ModelAndView mav) {
        List<Employee> emplist = empRepository.findByempnameLike("%empname%");
        mav.addObject("employeelist", emplist);
        mav.setViewName("/search");
        return mav;
      }
    
[/code]

[code]

    @Entity
    @Table(name="employee_tbl")
    @Getter
    public class Employee {
      @Id
      @Column(name="empno")
      @GeneratedValue(strategy=GenerationType.IDENTITY)
      private Long empno;
    
      @Column(name="empname")
      private String empname;
    }
    
[/code]

[code]

    @Repository //JpaRepository
    public interface EmployeeRepository extends JpaRepository<Employee, Long> {
    
      List<Employee> findByempnameLike(String string);
    
    }
    
[/code]

[code]

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:th="http://www.thymeleaf.org">
    <head>
    <title>index.html</title>
    <meta charset="utf-8" />
    </head>
    <body>
     <form action="/search" method="get">
      名前：
      <input type="text" name="empname">
      <input type="submit" value="送信">
     </form>
     <table>
      <tr th:each="emp : ${employeelist}" th:object="${emp}">
       <td th:text="*{empno}"></td>
       <td th:text="*{empname}"></td>
      </tr>
     </table>
    </body>
    </html>
    
[/code]

[code]

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
    <head>
    <title>search.html</title>
    <meta charset="utf-8" />
    </head>
    <body>
      <table>
        <tr th:each="emp : ${employeelist}" th:object="${emp}">
          <td th:text="*{empno}"></td>
          <td th:text="*{empname}"></td>
        </tr>
      </table>
    </body>
    </html>
    
[/code]


CC BY-SA 4.0
2021-10-22T05:05:15.157
83209
2021-10-25T09:55:07.347
2021-10-25T09:55:07.347
3060
48247
question
java spring-boot
Spring bootでの部分一致検索が上手くいかない


質問文中の書き方 `"%empname%"` だと、文字列 `empname`
を含むものをクエリしていることになるので、想定通り入力文字列を利用するには次のように書く必要があります。

[code]

        List<Employee> emplist = empRepository.findByempnameLike("%" + empname + "%");
    
[/code]

* * *

補足1:

上記のままでも動作するようですが、命名の慣例としては `findByEmpnameLike` とするのが良いかと思います(`By`
の直後の変数名の頭を大文字に)。

補足2:

一般的には、 `LIKE` に指定する文字列は `%` をエスケープする必要があるかと思います。  
ですので、実際には次のようになるべきではないかと思われます:

[code]

      @GetMapping("/search")
      public ModelAndView search(@RequestParam String empname, ModelAndView mav) {
        empname = EscapeCharacter.DEFAULT.escape(empname);
        List<Employee> emplist = empRepository.findByEmpnameLike("%" + empname + "%");
        // ...
      }
    
[/code]

補足3:

`Like` の代わりに (今回のような部分一致の場合)`Containing` を利用できます。  
`%`について気にせずに済むので `Like` より楽です:

[code]

      public ModelAndView search(@RequestParam String empname, ModelAndView mav) {
        List<Employee> emplist = empRepository.findByEmpnameContaining(empname);
        // ...
      }
    
[/code]

* * *

参考:

  * Spring Data JPA リファレンス > 5.1.3. Query Methods 
    * [Query Lookup Strategies](https://docs.spring.io/spring-data/jpa/docs/2.5.6/reference/html/#jpa.sample-app.finders.strategies)
    * [Query Creation > Table 3. Supported keywords inside method names Keyword Sample](https://docs.spring.io/spring-data/jpa/docs/2.5.6/reference/html/#jpa.query-methods.query-creation)


CC BY-SA 4.0
2021-10-24T00:57:53.253
83231
2021-10-24T00:57:53.253
2808
83209
answer