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);
    }
}

PersistenceContextEntityManager を直接持って来れるのが EJB の強みです。EntityManagerHibernate で言うところの Session 的な役割を果たします。後は結構 Hibernate に似ているところがありますので詳しくは解説しません。findHibernateload に相当します。

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 のそれに比べると複雑なのであまりお勧めできません。