6月26日

エンティティの削除

エンティティの削除は、URLのリクエストパラメータでIDを指定するように実装する。

MyDataDaoImpleに以下のメソッドを追加する。

	public void delete(MyData data) {
		EntityManager manager = factory.createEntityManager();
		EntityTransaction tx = manager.getTransaction();
		tx.begin();
		MyData entity = manager.merge(data);
		manager.remove(entity);
		tx.commit();
		manager.clear();
	}

	public void delete(long id) {
		delete(findById(id));
	}

コントローラでは、以下のメソッドを追加する。

	@RequestMapping(value = "/delete", method = RequestMethod.GET)
	public String delete(@RequestParam(value = "id")int id, Model model) {
		MyDataDao<MyData> dao = new MyDataDaoImpl();
		dao.delete(id);
		return "redirect:/mydata";
	}

JPQLを活用する

フォームで入力した値に従って検索できるようにする。

find.jspを作成する。

<!DOCTYPE html>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>${title}</title>
<style>
h1 { font-size: 16pt; background-color: #ccccff; padding: 3px;}
p { color: #000066; }
</style>
</head>
<body>
  <h1>${title}</h1>
  <p>${message}</p>
  <table>
  <form action="/SpringMyApp/find" method="post">
    <tr>
      <td>FIND:</td>
      <td><input type="text" name="fstr" size="20" /></td>
    </tr>
    <tr><td></td><td><input type="submit"></td></tr>
  </form>
  </table>
  <hr>
  <c:if test="${datalist != null}">
    <table border="1">
      <c:forEach var="obj" items="${datalist}" varStatus="status">
      <tr>
        <td><c:out value="${obj.id}" /></td>
        <td><c:out value="${obj.name}" /></td>
      </tr>
      </c:forEach>
    </table>
  </c:if>
</body>
</html>

コントローラにfind.jspに対応するメソッドを追加する。

	@RequestMapping(value = "/find", method = RequestMethod.GET)
	public String find(Model model) {
		model.addAttribute("title", "Sample");
		model.addAttribute("message", "検索のサンプルです。");
		MyDataDao<MyData> dao = new MyDataDaoImpl();
		List<MyData> list = dao.getAll();
		model.addAttribute("datalist", list);
		return "find";
	}

	@RequestMapping(value = "/find", method = RequestMethod.POST)
	public String search(@RequestParam(value = "fstr")String param, Model model) {
		model.addAttribute("title", "Sample");
		model.addAttribute("message", "「" + param + "」の検索結果");
		MyDataDao<MyData> dao = new MyDataDaoImpl();
		List<MyData> list = dao.find(param);
		model.addAttribute("datalist", list);
		return "find";
	}

MyDataDaoに検索用メソッドを追加する。

package jp.abc;

import java.io.Serializable;
import java.util.List;

public interface MyDataDao<T> extends Serializable {
	public List<T> getAll();
	public T findById(long id);
	public List<T> findByName(String name);
	public void add(T data);
	public void update(T data);
	public void delete(T data);
	public void delete(long id);
	public List<T> find(String param);
}

MyDataDaoImplでfindメソッドの実装を追加する。

	public List<MyData> find(String fstr) {
		EntityManager manager = factory.createEntityManager();
		List<MyData> list = null;
		String qstr = "from MyData where id = :fstr";
		Query q = manager.createQuery(qstr);
		q.setParameter("fstr", Long.parseLong(fstr));
		list = q.getResultList();
		manager.close();
		return list;
	}

以上のコードを追加して http://localhost:8080/SpringMyApp/find にアクセスすると、IDによる検索ができる。

複数の名前付きパラメータで検索できるようにする

MyDataDaoImplを次のように変更して、IDだけでなく、名前とメールアドレスの検索もできるようにする。

	public List<MyData> find(String fstr) {
		EntityManager manager = factory.createEntityManager();
		List<MyData> list = null;
		String qstr = "from MyData where id = :fid or name like :fname"
					+ " or mail like :fmail";
		Long fid = 0L;
		try {
			fid = Long.parseLong(fstr);
		} catch (NumberFormatException e) {
			//e.printStackTrace();
		}
		Query q = manager.createQuery(qstr);
		q.setParameter("fid", fid)
			.setParameter("fname", "%" + fstr + "%")
			.setParameter("fmail", fstr + "@%");
		list = q.getResultList();
		manager.close();
		return list;
	}

CriteriaAPI による検索

CriteriaAPI による検索を行うため、新しくMyDataDaoCriteriaクラスを作成する。
まずは、クラスの全メンバーを、MyDataDaoImplからコピーして、CriteriaAPIを使うところだけを書き換えていく。

	public List<MyData> getAll() {
		EntityManager manager = factory.createEntityManager();
		List<MyData> list = null;
		CriteriaBuilder builder = manager.getCriteriaBuilder();
		CriteriaQuery<MyData> q = builder.createQuery(MyData.class);
		Root<MyData> root = q.from(MyData.class);
		q.select(root);
		list = (List<MyData>)manager.createQuery(q).getResultList();
		return list;
	}

MyDataController で dao.getALl() を使っている部分を、MyDataDaoCriteria を使うように書き換える。

	@RequestMapping(value = "/mydata", method = RequestMethod.GET)
	public String mydata(Model model) {
		model.addAttribute("title");
		model.addAttribute("message", "MyDataのサンプルです。");
		MyData mydata = new MyData();
		model.addAttribute("myData", mydata);
		MyDataDao<MyData> dao = new MyDataDaoCriteria();
		List<MyData> list = dao.getAll();
		model.addAttribute("datalist", list);
		return "mydata";
	}

CriteriaAPIでfindの実装を書き換えてみる。

	public List<MyData> find(String fstr) {
		EntityManager manager = factory.createEntityManager();
		List<MyData> list = null;
		CriteriaBuilder builder = manager.getCriteriaBuilder();
		CriteriaQuery<MyData> q = builder.createQuery(MyData.class);
		Root<MyData> root = q.from(MyData.class);
		q.select(root).where(builder.equal(root.get("name"), fstr));
		list = (List<MyData>)manager.createQuery(q).getResultList();
		return list;
	}

MyDataController の find を呼び出すところを、MyDataDaoCriteria に変更する。

	@RequestMapping(value = "/find", method = RequestMethod.GET)
	public String find(Model model) {
		model.addAttribute("title", "Sample");
		model.addAttribute("message", "検索のサンプルです。");
		MyDataDao<MyData> dao = new MyDataDaoCriteria();
		List<MyData> list = dao.getAll();
		model.addAttribute("datalist", list);
		return "find";
	}

	@RequestMapping(value = "/find", method = RequestMethod.POST)
	public String search(@RequestParam(value = "fstr")String param, Model model) {
		model.addAttribute("title", "Sample");
		model.addAttribute("message", "「" + param + "」の検索結果");
		MyDataDao<MyData> dao = new MyDataDaoCriteria();
		List<MyData> list = dao.find(param);
		model.addAttribute("datalist", list);
		return "find";
	}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です