LoginSignup
0
0

More than 1 year has passed since last update.

計算結果を実装する方法

Last updated at Posted at 2023-03-18

本記事は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;
   }
   
   
}

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0