JPA¤È¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤ÎNamedQuery
JPA¤ÇNamedQuery(JPQL)¤ò»ÈÍѤ¹¤ë¤È¤¤Ï¥¨¥ó¥Æ¥£¥Æ¥£¡¼¥¯¥é¥¹¤Ë¤Æ¥¢¥Î¥Æ¡¼¥·¥ç¥ó¤Ç»ØÄꤹ¤ë¤«¡¢orm.xml¥Õ¥¡¥¤¥ë¤Ë¤Æ<named-query>¤ò»ÈÍѤ¹¤ë¾ì¹ç¤¬¤¢¤ë¤È»×¤¤¤Þ¤¹¡£
¤¤¤º¤ì¤â¼ÂÁõ¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ë¤È»×¤¤¤Þ¤¹¡£
°Ê²¼¤Î¤Ï¥¢¥Î¥Æ¡¼¥·¥ç¥ó¤Ë¤ÆNamedQuery¤ò»ÈÍѤ·¤¿¾ì¹ç
@Entity
@NamedQueries({
@NamedQuery(
name="UseinfoDao.findByName",
query="Select e From Userinfo e Where e.name = ?1")
})
public class Userinfo {
:
:
}
public class UserinfoDao {
:
private EntityManager em;
public setEntityManager(EntityManager em){
this.em = em;
}
:
public List findByName(String name){
Query query = em.createNamedQuery("UseinfoDao.findByName");
query.setParameter(1, name);
List userinfos = query.getResultList();
return userinfos;
}
:
}
¤³¤ì¤òJava¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤ÎProxy¤ò»ÈÍѤ·¤Æ´ÊÁDz½¤·¤Þ¤¹¡£
¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤Ï¡¢¡Ö¤¢¤ë¥¯¥é¥¹¤Î¥á¥½¥Ã¥É¤ä¥×¥í¥Ñ¥Æ¥£¤Î¾ðÊó¤ò¼èÆÀ¤¹¤ë¡×¤³¤È¤Ç¡¢Proxy¤Ï¡Ö¥á¥½¥Ã¥É¤ä¥×¥í¥Ñ¥Æ¥£¤Î¼Â¹ÔÁ°¸å¤Ë½èÍý¤ò¤Ä¤¤¤«¤¹¤ë¡×¤³¤È¤Ç¤¹¡£
¤Þ¤ºÁ°²óºîÀ®¤·¤¿GenericDao¤ò·Ñ¾µ¤·¤¿°Ê²¼¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òºîÀ®¤·¤Þ¤¹¡£¥¨¥ó¥Æ¥£¥Æ¥£¡¼Usefinfo¤Î¼ç¥¡¼¤ÏLong·¿¤È¤·¤Þ¤¹¡£
public interface UserinfoDao extends GenericDao<Userinfo, Long> {
public List findByName(String name);
}
¼¡¤ËUserinfo¤Ç¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤¹¤ë¤¿¤á¤ÎFactoryBean¤ÈProxy¤Ç½èÍý¹Ô¤¦Á°½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
public class NamedQueriesFactory {
@SuppressWarnings("unchecked")
public static <T> T getQueryProxy(EntityManager em, Class<T> type) {
NamedQueryDynamicProxy handler = new NamedQueryDynamicProxy(type, em);
return (T) Proxy.newProxyInstance(type.getClassLoader(), new Class[]{type}, handler);
}
}
public class NamedQueryDynamicProxy implements InvocationHandler {
private final Class<?> type;
private final EntityManager em;
private static String typeString = "dao.generic.GenericDao"; ¢« GenericDao¥¯¥é¥¹¤Î¥Ñ¥Ã¥±¡¼¥¸¤È¥¯¥é¥¹
¡¡¡¡public NamedQueryDynamicProxy(Class<?> type, EntityManager em) {
Type[] genericIf = type.getGenericInterfaces();
this.type = (Class<?>)((ParameterizedType)genericIf [0]).getActualTypeArguments()[0];
this.em = em;
}
@SuppressWarnings("unchecked")
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Class<?> genericDaoType = Class.forName(typeString);
if(method.getDeclaringClass().equals(genericDaoType)){
GenericDao<?, ?> genericDao = new GenericDaoImpl(type, em);
return method.invoke(genericDao, args);
} else {
return getResultByNamedQuery(method, args);
}
}
private Object getResultByNamedQuery(Method method, Object[] args) throws Throwable {
boolean isMultiResults = Collection.class.isAssignableFrom(method.getReturnType());
String queryName = method.getDeclaringClass().getName() + "." + method.getName();
Query namedQuery = em.createNamedQuery(queryName);
setPositionalParams(args, namedQuery);
if (isMultiResults) {
return namedQuery.getResultList();
} else {
return namedQuery.getSingleResult();
}
}
private void setPositionalParams(Object[] args, Query namedQuery) throws Throwable {
if (args != null && args.length > 0) {
for (int i = 0; i < args.length; i++) {
namedQuery.setParameter(i + 1, args[i]);
}
}
}
}
»ÈÍÑÊýË¡¤Ï°Ê²¼¤ÎÄ̤ê
EntityManager em;
:
UserinfoDao userinfoDao = NamedQueriesFactory.getQueryProxy(em, UserinfoDao.class);
List userinfos = userinfoDao.findByName("hoge");
¤¢¤È¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÈNamedQuery¤ÎÄêµÁ¤òÄɲ䷤Ƥ¤¤¯¤À¤±
º£²ó¤ÏsetParameter¤ÏPosition(e.name = ?1)¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¤¬¡¢ÆÈ¼«ºîÀ®¤Î¥¢¥Î¥Æ¡¼¥·¥ç¥ó¤ò¶î»È¤·¤ÆÌ¾Á°ÉÕ¤¥¯¥¨¥ê(e.name = :name)¤Î¼ÂÁõ¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£