Kohei Nozaki's blog 

JPQLをorm.xmlに書いてみる


Posted on Tuesday Jan 21, 2014 at 08:04AM in Technology


何をするの?

JPQLをorm.xmlに書いて動かしてみます。

環境

  • WildFly8.0.0CR1
  • Eclipse Kepler SR1
  • PostgreSQL 9.2.4
  • Oracle JDK7u51

準備

これの続きです。

orm.xmlに書いたクエリを動かしてみる

orm.xmlを作る

src/main/java/META-INFの下に作ります。右クリックメニューからNew→JPA ORM Mapping File

場所を確かめてFinish

出来たら開きましょう

クエリを書く

named-queryを書いてみます。エンティティに直書きしてたのとほとんど同じです。違うのはidで逆順ソートかけてるとこだけです

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings version="2.1"
	xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm http://xmlns.jcp.org/xml/ns/persistence/orm_2_1.xsd">
	<named-query name="findHogeEntityAllDesc">
                <query>
                 SELECT
                     e
                 FROM
                     HogeEntity e
                 ORDER BY
                     e.id DESC
                </query>
	</named-query>
</entity-mappings>

この書き方だと < とか > をエスケープしないといけないのが面倒くさいですが、こういう感じで書くとそのまま書けます。

Daoにメソッドを追加

findAllDesc()を追加します

package com.example.dao;

import java.util.Date;
import java.util.List;

import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional;

import com.example.entity.HogeEntity;

@Named
public class HogeEntityDao {

	@PersistenceContext
	private EntityManager em;

	@Transactional
	public void save() {
		HogeEntity e = new HogeEntity();
		e.setHogeDate(new Date());
		em.persist(e);
	}

	public List<HogeEntity> findAll() {
		return em.createNamedQuery("findHogeEntityAll", HogeEntity.class).getResultList();
	}
	
	public List<HogeEntity> findAllDesc() {
		return em.createNamedQuery("findHogeEntityAllDesc", HogeEntity.class).getResultList();
	}
}

サーブレットから呼び出すメソッドを変更

package com.example.servlet;

import java.io.IOException;
import java.io.Writer;

import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.example.dao.HogeEntityDao;
import com.example.entity.HogeEntity;

@WebServlet("/HogeServlet")
public class HogeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Inject
	HogeEntityDao dao;

	public HogeServlet() {
		super();
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		dao.save();
		try (Writer w = response.getWriter()) {
//			for (HogeEntity e : dao.findAll()) {
			for (HogeEntity e : dao.findAllDesc()) {
				w.write("id=" + e.getId() + ", hogeDate=" + e.getHogeDate() + "\n");
			}
		}
	}
}

動かしてみる

逆順になりました。改行とかも自由なので、やっぱりクエリはエンティティのアノテーション内に書くよりorm.xmlに書いた方が良い気がします。



No one has commented yet.

Leave a Comment

HTML Syntax: NOT allowed