単テーブルにおける検索¶
CriteriaAPIを使ったデータ検索¶
単テーブルにおけるSELECTを実施する場合は、JPAのCriteria APIを使用して実装する。GenericDaoの様に共通化したメソッドを経由して実行するとよい。
例) ユーザを単体検索する場合
test-javaee6-ejb org.debugroom.test.domain.repository.impl.jpa.UserRepositoryImpl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package org.debugroom.test.domain.repository.impl.jpa;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import org.debugroom.test.domain.model.User;
import org.debugroom.test.domain.repository.UserRepository;
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class UserRepositoryImpl extends GenericDaoImpl<User, String> implements UserRepository{
@Override
public User findOne(String userId) {
// GenericDaoが持つfindメソッドを呼ぶ。
return find(userId);
}
}
|
test-javaee6-ejb org.debugroom.test.domain.repository.impl.jpa.GenericDaoImpl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package org.debugroom.test.domain.repository.impl.jpa;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.debugroom.test.domain.repository.GenericDao;
@SuppressWarnings("unchecked")
public abstract class GenericDaoImpl<T extends Serializable, ID extends Serializable>
implements GenericDao<T, ID>{
Class<T> clazz;
@PersistenceContext
EntityManager entityManager;
public GenericDaoImpl(){
ParameterizedType parameterizedType = (ParameterizedType)getClass().getGenericSuperclass();
this.clazz = (Class<T>) parameterizedType.getActualTypeArguments()[0];
}
// 実際には、型パラメータTがUserとして、このメソッドが実行される。
@Override
public T find(ID id) {
return (T)entityManager.find(clazz, id);
}
}
|