7月14日

Criteria APIを使用したクエリ

Webページにページングを追加する

Criteria API での検索には、setFirstResult() で先頭の位置を指定し、setMaxResults()で取得するデータの最大数を指定する。

MyDataDaoImpl.java

	public List<MyData> getList() {
		int offset = 0;
		int limit = 5;
		EntityManager manager = factory.createEntityManager();
		List<MyData> list = null;
		CriteriaBuilder builder = manager.getCriteriaBuilder();
		CriteriaQuery<MyData> query = builder.createQuery(MyData.class);
		Root<MyData> root = query.from(MyData.class);
		query.select(root);
		list = manager.createQuery(query)
				.setFirstResult(offset)
				.setMaxResults(limit)
				.getResultList();
		return list;
	}

JSPにページング用のリンクを追加する。

mydata.jsp

	<a href="mydata?offset=0">1</a>&nbsp;<a href="mydata?offset=5">2</a>

コントローラでリクエストパラメータを受け取る。@RequestParam アノテーションを追加し、Integer型のoffsetパラメータを追加する。

MyDataController.java

	@RequestMapping(value = "/mydata", method = RequestMethod.GET)
	public String mydata(@RequestParam(required = false) Integer offset, Model model) {
		model.addAttribute("title", "Sample " + offset);
		model.addAttribute("message", "MyDataのサンプルです");
		MyData mydata = new MyData();
		model.addAttribute("myData", mydata);
		MyDataDao<MyData> dao = new MyDataDaoImpl();
		List<MyData> list = dao.getList();
		model.addAttribute("datalist", list);
		return "mydata";
	}

DAOにパラメータつきのgetList()をオーバーロードで追加する。

MyDataDao.java

public interface MyDataDao <T> extends Serializable {
	public List<T> getAll();
	public List<T> getList();
	public List<T> getList(int offset, int max);
	public List<T> find(String param);

DAOの実装にgetList()を追加する。

MyDataDaoImpl.java

	public List<MyData> getList(int offset, int max) {
		EntityManager manager = factory.createEntityManager();
		List<MyData> list = null;
		CriteriaBuilder builder = manager.getCriteriaBuilder();
		CriteriaQuery<MyData> query = builder.createQuery(MyData.class);
		Root<MyData> root = query.from(MyData.class);
		query.select(root);
		list = manager.createQuery(query)
				.setFirstResult(offset)
				.setMaxResults(max)
				.getResultList();
		return list;
	}

コントローラでリクエストパラメータから受け取ったオフセットをDAOに渡すようにする。

MyDataController.java

	@RequestMapping(value = "/mydata", method = RequestMethod.GET)
	public String mydata(@RequestParam(required = false) Integer offset, Model model) {
		model.addAttribute("title", "Sample " + offset);
		model.addAttribute("message", "MyDataのサンプルです");
		MyData mydata = new MyData();
		model.addAttribute("myData", mydata);
		MyDataDao<MyData> dao = new MyDataDaoImpl();
		int off = offset == null ? 0 : offset;
		List<MyData> list = dao.getList(off, 5);
		model.addAttribute("datalist", list);
		return "mydata";
	}

コメントを残す

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