はじめに
Springを使って、データベースに登録されている名前を「あいまい検索(部分一致検索)」できるように実装しようとしたところ、思いのほか苦戦したので、備忘録として手順とコードをまとめておきます。
サンプルコード
サンプルコード
User.java
package com.example.demo;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
@Entity
@Table(name="users")
public class User {
@Column(name="name")
private String name;
public User() {
}
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
UserRepository.java
package com.example.demo;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
List<User> findByNameLike(String name);
}
SearchController.java
package com.example.demo;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class SearchController {
@Autowired
UserRepository userRepository;
@RequestMapping("/search")
public ModelAndView searchCode(
ModelAndView mv,
@RequestParam(value = "name", defaultValue = "") String name) {
List<User> users = new ArrayList<>();
// 検索
// 名前が空欄の場合は実行しない
if (!name.equals("")) {
users = userRepository.findByNameLike("%" + name + "%");
}
// 検索した名前がヒット
if(!users.isEmpty()){
mv.addObject("users", users);
}
mv.setViewName("users");
return mv;
}
}
プログラムの簡単な解説
あいまい検索の処理は、SearchController.java
の部分で実行されています。
SearchController.java
if (!name.equals("")) {
users = userRepository.findByNameLike("%" + name + "%");
}
findByNameLike
メソッドの引数には、検索キーワードを%
で囲んだ文字列を渡しています。これにより、名前の部分一致検索が可能になります(例:%太郎%
で「山田太郎」や「太郎丸」などがヒットします)。
このfindByNameLike
メソッドは、UserRepository.java
で定義しています。Spring Data JPAの機能を活用することで、メソッド名だけでSQLのようなあいまい検索を実現できるのが特徴です。