本記事はspringbootを用いて検索したユーザーの数を表示する際にどのようにして表示するかを共有しているものです。
まずEntityで構成queryを定義します。
TrainigUser.java
package jp.co.sss.training.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.NamedQuery;
import jakarta.persistence.Table;
@Entity
@Table(name="training_user")
@NamedQuery(name = "findByUserIdNamedQuery",query = "SELECT u FROM TrainingUser u WHERE u.userId LIKE CONCAT('%', :keyword, '%')")
@NamedQuery(name = "findByUserIdByCount",query = "SELECT count(u) FROM TrainingUser u WHERE u.userId LIKE CONCAT('%', :keyword, '%')")
public class TrainingUser {
@Id
private int id;
@Column
private String userId;
@Column
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserId() {
return userId;
}
public void setUserId(String name) {
this.userId = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
今回は、まずNamedQueryでqueryを定義するところからスタートしました。これで、findByUserIdByCountという検索した内容に該当するユーザーが何人か調べるQueryができました。
これをCotorollerで実装します。
TrainingUserContoroler.java
package jp.co.sss.training.contoroller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import jp.co.sss.training.Form.SerchForm;
import jp.co.sss.training.entity.TrainingUser;
import jp.co.sss.training.repository.UserRepository;
@Controller
public class TrainingUserContoroller {
@Autowired
UserRepository repository;
@Autowired
EntityManager entitymanager;
@GetMapping(path="/lesson04_03/serchByUserIdByCount")
public String serchByUserIdByCount(SerchForm form,Model model) {
TypedQuery<Long> query = entitymanager.createNamedQuery("findByUserIdByCount",Long.class);
query.setParameter("keyword", form.getWord());
Long results = query.getSingleResult();
model.addAttribute("count",results);
return "lesson04_03/index";
}
この時、TypedQueryの型をTrainigUserにしてしまうと検索結果が一つなのに、複数項目ある状態になってしまい上手く動かない。そのため、Long等数値が入る型にして下さい。また、query.の後ろは必ずgetSingleResult();です。getResultList()にするとこれもエラーになってしまいます。複数結果が返ってこないという点に留意しましょう!
最後にテンプレートです。
index.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>Insert title here</title>
</head>
<body>
<form action="/lesson04_03/serchByUserIdByCount">
ユーザー名(あいまい検索)<input type="text" name="word" />
<input type="submit" value="検索する">
</form>
<div>該当人数:[[${count}]]人</div>
</body>
</html>
この時
の中身を同一行にするには、該当人数:[[${count}]]人
と書いてください。
追記:
ちなみにSerchForm.javaの中身は下記のような感じです。
SerchForm.java
package jp.co.sss.training.Form;
public class SerchForm {
private String word;
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
}