JPQLをorm.xmlに書いてみる
TweetPosted 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に書いた方が良い気がします。
Tags: jpa