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