JPA + EJB + JSF による Web アプリケーション(その 2)
EJB による DAO 層の実装
DAO を EJB を用いて実装します。
package jp.mydns.akanekodou.dao; import javax.ejb.Local; import java.util.List; import jp.mydns.akanekodou.entity.Customer; @Local public interface CustomerDAO { List<Customer> all(); Customer find(int id); }
package jp.mydns.akanekodou.dao; import javax.ejb.Stateless; import javax.persistence.PersistenceContext; import javax.persistence.EntityManager; import javax.persistence.Query; import java.util.List; import jp.mydns.akanekodou.entity.Customer; @Stateless public class CustomerDAOImpl implements CustomerDAO { @PersistenceContext private EntityManager manager; @Override public List<Customer> all() { Query query = manager.createQuery("from Customer"); @SuppressWarnings("unchecked") List<Customer> result = query.getResultList(); return result; } @Override public Customer find(int id) { return manager.find(Customer.class, id); } }
PersistenceContext
で EntityManager
を直接持って来れるのが EJB の強みです。EntityManager
が Hibernate で言うところの Session
的な役割を果たします。後は結構 Hibernate に似ているところがありますので詳しくは解説しません。find
は Hibernate の load
に相当します。
package jp.mydns.akanekodou.dao; import javax.ejb.Local; import java.util.List; import jp.mydns.akanekodou.entity.Product; @Local public interface ProductDAO { List<Product> like(String keyword); }
package jp.mydns.akanekodou.dao; import java.util.List; import javax.ejb.Stateless; import javax.persistence.PersistenceContext; import javax.persistence.EntityManager; import javax.persistence.Query; import jp.mydns.akanekodou.entity.Product; @Stateless public class ProductDAOImpl implements ProductDAO { @PersistenceContext private EntityManager manager; @Override public List<Product> like(String keyword) { Query query = manager.createQuery("from Product where name like :keyword"); query.setParameter("keyword", "%" + keyword.replace("%", "\\%").replace("_","\\_") + "%"); @SuppressWarnings("unchecked") List<Product> result = query.getResultList(); return result; } }
JPQL による問い合わせを利用したあいまい検索。JPA 用の Criteria API もあるのですが、Hibernate のそれに比べると複雑なのであまりお勧めできません。