Collection<User> users = (Collection<User>)query.execute();
でも、めんどくさいです。(´・ω・`)
しかも、キャストのところでコンパイラが警告を出します。
@SuppressWarning("unchecked") とか書けば警告は消えますが。
でも、めんどくさいです。(´・ω・`)
ということで、execute系メソッドの引数として型変数を渡せるようなクラスを作成してみました。
PersistenceManagerExt.java
package com.objectfanatics.gae.datastore; import java.util.Collection; import java.util.Date; import java.util.EnumSet; import java.util.Set; import javax.jdo.Extent; import javax.jdo.FetchGroup; import javax.jdo.FetchPlan; import javax.jdo.JDOException; import javax.jdo.ObjectState; import javax.jdo.PersistenceManager; import javax.jdo.PersistenceManagerFactory; import javax.jdo.Transaction; import javax.jdo.datastore.JDOConnection; import javax.jdo.datastore.Sequence; import javax.jdo.listener.InstanceLifecycleListener; /** * PersistenceManager for QueryExt. */ public class PersistenceManagerExt implements PersistenceManager { /** * PersistenceManager instance to be delegated. */ private final PersistenceManager instance; /** * Constructor. * * @param instance instance to be delegated */ public PersistenceManagerExt(PersistenceManager instance) { this.instance = instance; } // for generics @SuppressWarnings("unchecked") @Override public QueryExt newNamedQuery(Class cls, String filter) { return new QueryExt(instance.newNamedQuery(cls, filter)); } @Override public QueryExt newQuery() { return new QueryExt(instance.newQuery()); } @SuppressWarnings("unchecked") @Override public QueryExt newQuery(Class cls, Collection cln, String filter) { return new QueryExt(instance.newQuery(cls, cln, filter)); } @SuppressWarnings("unchecked") @Override public QueryExt newQuery(Class cls, Collection cln) { return new QueryExt(instance.newQuery(cls, cln)); } @SuppressWarnings("unchecked") @Override public QueryExt newQuery(Class cls, String filter) { return new QueryExt(instance.newQuery(cls, filter)); } @SuppressWarnings("unchecked") @Override public QueryExt newQuery(Class cls) { return new QueryExt(instance.newQuery(cls)); } @SuppressWarnings("unchecked") @Override public QueryExt newQuery(Extent cln, String filter) { return new QueryExt(instance.newQuery(cln, filter)); } @SuppressWarnings("unchecked") @Override public QueryExt newQuery(Extent cln) { return new QueryExt(instance.newQuery(cln)); } @Override public QueryExt newQuery(Object compiled) { return new QueryExt(instance.newQuery(compiled)); } @Override public QueryExt newQuery(String language, Object query) { return new QueryExt(instance.newQuery(language, query)); } @Override public QueryExt newQuery(String query) { return new QueryExt(instance.newQuery(query)); } // delegate methods. @SuppressWarnings("unchecked") @Override public void addInstanceLifecycleListener(InstanceLifecycleListener listener, Class... classes) { instance.addInstanceLifecycleListener(listener, classes); } @Override public void checkConsistency() { instance.checkConsistency(); } @Override public void close() { instance.close(); } @Override public Transaction currentTransaction() { return instance.currentTransaction(); } @Override public void deletePersistent(Object pc) { instance.deletePersistent(pc); } @SuppressWarnings("unchecked") @Override public void deletePersistentAll(Collection pcs) { instance.deletePersistentAll(pcs); } @Override public void deletePersistentAll(Object... pcs) { instance.deletePersistentAll(pcs); } @Override public <T> T detachCopy(T pc) { return instance.detachCopy(pc); } @Override public <T> Collection<T> detachCopyAll(Collection<T> pcs) { return instance.detachCopyAll(pcs); } @Override public <T> T[] detachCopyAll(T... pcs) { return instance.detachCopyAll(pcs); } @Override public void evict(Object pc) { instance.evict(pc); } @Override public void evictAll() { instance.evictAll(); } @SuppressWarnings("unchecked") @Override public void evictAll(boolean subclasses, Class pcClass) { instance.evictAll(subclasses, pcClass); } @SuppressWarnings("unchecked") @Override public void evictAll(Collection pcs) { instance.evictAll(pcs); } @Override public void evictAll(Object... pcs) { instance.evictAll(pcs); } @Override public void flush() { instance.flush(); } @Override public boolean getCopyOnAttach() { return instance.getCopyOnAttach(); } @Override public JDOConnection getDataStoreConnection() { return instance.getDataStoreConnection(); } @Override public boolean getDetachAllOnCommit() { return instance.getDetachAllOnCommit(); } @Override public <T> Extent<T> getExtent(Class<T> persistenceCapableClass, boolean subclasses) { return instance.getExtent(persistenceCapableClass, subclasses); } @Override public <T> Extent<T> getExtent(Class<T> persistenceCapableClass) { return instance.getExtent(persistenceCapableClass); } @SuppressWarnings("unchecked") @Override public FetchGroup getFetchGroup(Class cls, String name) { return instance.getFetchGroup(cls, name); } @Override public FetchPlan getFetchPlan() { return instance.getFetchPlan(); } @Override public boolean getIgnoreCache() { return instance.getIgnoreCache(); } @SuppressWarnings("unchecked") @Override public Set getManagedObjects() { return instance.getManagedObjects(); } @SuppressWarnings("unchecked") @Override public Set getManagedObjects(Class... classes) { return instance.getManagedObjects(classes); } @SuppressWarnings("unchecked") @Override public Set getManagedObjects(EnumSet<ObjectState> states, Class... classes) { return instance.getManagedObjects(states, classes); } @SuppressWarnings("unchecked") @Override public Set getManagedObjects(EnumSet<ObjectState> states) { return instance.getManagedObjects(states); } @Override public boolean getMultithreaded() { return instance.getMultithreaded(); } @Override public <T> T getObjectById(Class<T> cls, Object key) { return instance.getObjectById(cls, key); } @Override public Object getObjectById(Object oid, boolean validate) { return instance.getObjectById(oid, validate); } @Override public Object getObjectById(Object oid) { return instance.getObjectById(oid); } @Override public Object getObjectId(Object pc) { return instance.getObjectId(pc); } @SuppressWarnings("unchecked") @Override public Class getObjectIdClass(Class cls) { return instance.getObjectIdClass(cls); } @Override public Object[] getObjectsById(boolean validate, Object... oids) { return instance.getObjectsById(validate, oids); } @SuppressWarnings("unchecked") @Override public Collection getObjectsById(Collection oids, boolean validate) { return instance.getObjectsById(oids, validate); } @SuppressWarnings("unchecked") @Override public Collection getObjectsById(Collection oids) { return instance.getObjectsById(oids); } @Override public Object[] getObjectsById(Object... oids) { return instance.getObjectsById(oids); } @SuppressWarnings("deprecation") @Override public Object[] getObjectsById(Object[] oids, boolean validate) { return instance.getObjectsById(oids, validate); } @Override public PersistenceManagerFactory getPersistenceManagerFactory() { return instance.getPersistenceManagerFactory(); } @Override public Integer getQueryTimeoutMillis() { return instance.getQueryTimeoutMillis(); } @Override public Sequence getSequence(String name) { return instance.getSequence(name); } @Override public Date getServerDate() { return instance.getServerDate(); } @Override public Object getTransactionalObjectId(Object pc) { return instance.getTransactionalObjectId(pc); } @Override public Object getUserObject() { return instance.getUserObject(); } @Override public Object getUserObject(Object key) { return instance.getUserObject(key); } @Override public boolean isClosed() { return instance.isClosed(); } @Override public void makeNontransactional(Object pc) { instance.makeNontransactional(pc); } @SuppressWarnings("unchecked") @Override public void makeNontransactionalAll(Collection pcs) { instance.makeNontransactionalAll(pcs); } @Override public void makeNontransactionalAll(Object... pcs) { instance.makeNontransactionalAll(pcs); } @Override public <T> T makePersistent(T pc) { return instance.makePersistent(pc); } @Override public <T> Collection<T> makePersistentAll(Collection<T> pcs) { return instance.makePersistentAll(pcs); } @Override public <T> T[] makePersistentAll(T... pcs) { return instance.makePersistentAll(pcs); } @Override public void makeTransactional(Object pc) { instance.makeTransactional(pc); } @SuppressWarnings("unchecked") @Override public void makeTransactionalAll(Collection pcs) { instance.makeTransactionalAll(pcs); } @Override public void makeTransactionalAll(Object... pcs) { instance.makeTransactionalAll(pcs); } @Override public void makeTransient(Object pc, boolean useFetchPlan) { instance.makeTransient(pc, useFetchPlan); } @Override public void makeTransient(Object pc) { instance.makeTransient(pc); } @Override public void makeTransientAll(boolean useFetchPlan, Object... pcs) { instance.makeTransientAll(useFetchPlan, pcs); } @SuppressWarnings("unchecked") @Override public void makeTransientAll(Collection pcs, boolean useFetchPlan) { instance.makeTransientAll(pcs, useFetchPlan); } @SuppressWarnings("unchecked") @Override public void makeTransientAll(Collection pcs) { instance.makeTransientAll(pcs); } @Override public void makeTransientAll(Object... pcs) { instance.makeTransientAll(pcs); } @SuppressWarnings("deprecation") @Override public void makeTransientAll(Object[] pcs, boolean useFetchPlan) { instance.makeTransientAll(pcs, useFetchPlan); } @Override public <T> T newInstance(Class<T> pcClass) { return instance.newInstance(pcClass); } @SuppressWarnings("unchecked") @Override public Object newObjectIdInstance(Class pcClass, Object key) { return instance.newObjectIdInstance(pcClass, key); } @Override public Object putUserObject(Object key, Object val) { return instance.putUserObject(key, val); } @Override public void refresh(Object pc) { instance.refresh(pc); } @Override public void refreshAll() { instance.refreshAll(); } @SuppressWarnings("unchecked") @Override public void refreshAll(Collection pcs) { instance.refreshAll(pcs); } @Override public void refreshAll(JDOException jdoe) { instance.refreshAll(jdoe); } @Override public void refreshAll(Object... pcs) { instance.refreshAll(pcs); } @Override public void removeInstanceLifecycleListener(InstanceLifecycleListener listener) { instance.removeInstanceLifecycleListener(listener); } @Override public Object removeUserObject(Object key) { return instance.removeUserObject(key); } @Override public void retrieve(Object pc, boolean useFetchPlan) { instance.retrieve(pc, useFetchPlan); } @Override public void retrieve(Object pc) { instance.retrieve(pc); } @Override public void retrieveAll(boolean useFetchPlan, Object... pcs) { instance.retrieveAll(useFetchPlan, pcs); } @SuppressWarnings("unchecked") @Override public void retrieveAll(Collection pcs, boolean useFetchPlan) { instance.retrieveAll(pcs, useFetchPlan); } @SuppressWarnings("unchecked") @Override public void retrieveAll(Collection pcs) { instance.retrieveAll(pcs); } @Override public void retrieveAll(Object... pcs) { instance.retrieveAll(pcs); } @SuppressWarnings("deprecation") @Override public void retrieveAll(Object[] pcs, boolean useFetchPlan) { instance.retrieveAll(pcs, useFetchPlan); } @Override public void setCopyOnAttach(boolean flag) { instance.setCopyOnAttach(flag); } @Override public void setDetachAllOnCommit(boolean flag) { instance.setDetachAllOnCommit(flag); } @Override public void setIgnoreCache(boolean flag) { instance.setIgnoreCache(flag); } @Override public void setMultithreaded(boolean flag) { instance.setMultithreaded(flag); } @Override public void setQueryTimeoutMillis(Integer interval) { instance.setQueryTimeoutMillis(interval); } @Override public void setUserObject(Object o) { instance.setUserObject(o); } }
QueryExt.java
package com.objectfanatics.gae.datastore; import java.util.Collection; import java.util.Map; import javax.jdo.Extent; import javax.jdo.FetchPlan; import javax.jdo.PersistenceManager; import javax.jdo.Query; /** * Generics enabled Query extension. */ public class QueryExt implements Query { /** * Query instance to be delegated. */ private final Query instanceToBeDelegated; /** * Constructor. * @param instanceToBeDelegated Query instance to be delegated */ public QueryExt(Query instanceToBeDelegated) { if (instanceToBeDelegated == null) throw new IllegalArgumentException("instanceToBeDelegated must not be null."); this.instanceToBeDelegated = instanceToBeDelegated; } // for generics. @SuppressWarnings("unchecked") public <T> Collection<T> executeExt(Class<T> t) { return (Collection<T>)instanceToBeDelegated.execute(); } @SuppressWarnings("unchecked") public <T> Collection<T> executeExt(Class<T> t, Object p1, Object p2, Object p3) { return (Collection<T>)instanceToBeDelegated.execute(p1, p2, p3); } @SuppressWarnings("unchecked") public <T> Collection<T> executeExt(Class<T> t, Object p1, Object p2) { return (Collection<T>)instanceToBeDelegated.execute(p1, p2); } @SuppressWarnings("unchecked") public <T> Collection<T> executeExt(Class<T> t, Object p1) { return (Collection<T>)instanceToBeDelegated.execute(p1); } @SuppressWarnings("unchecked") public <T> Collection<T> executeWithArrayExt(Class<T> t, Object... parameters) { return (Collection<T>)instanceToBeDelegated.executeWithArray(parameters); } @SuppressWarnings("unchecked") public <T> Collection<T> executeWithMapExt(Class<T> t, Map parameters) { return (Collection<T>)instanceToBeDelegated.executeWithMap(parameters); } // delegate methods. @Override public void addExtension(String key, Object value) { instanceToBeDelegated.addExtension(key, value); } @SuppressWarnings("unchecked") @Override public void addSubquery(Query sub, String variableDeclaration, String candidateCollectionExpression, Map parameters) { instanceToBeDelegated.addSubquery(sub, variableDeclaration, candidateCollectionExpression, parameters); } @Override public void addSubquery(Query sub, String variableDeclaration, String candidateCollectionExpression, String... parameters) { instanceToBeDelegated.addSubquery(sub, variableDeclaration, candidateCollectionExpression, parameters); } @Override public void addSubquery(Query sub, String variableDeclaration, String candidateCollectionExpression, String parameter) { instanceToBeDelegated.addSubquery(sub, variableDeclaration, candidateCollectionExpression, parameter); } @Override public void addSubquery(Query sub, String variableDeclaration, String candidateCollectionExpression) { instanceToBeDelegated.addSubquery(sub, variableDeclaration, candidateCollectionExpression); } @Override public void cancel(Thread thread) { instanceToBeDelegated.cancel(thread); } @Override public void cancelAll() { instanceToBeDelegated.cancelAll(); } @Override public void close(Object queryResult) { instanceToBeDelegated.close(queryResult); } @Override public void closeAll() { instanceToBeDelegated.closeAll(); } @Override public void compile() { instanceToBeDelegated.compile(); } @Override public void declareImports(String imports) { instanceToBeDelegated.declareImports(imports); } @Override public void declareParameters(String parameters) { instanceToBeDelegated.declareParameters(parameters); } @Override public void declareVariables(String variables) { instanceToBeDelegated.declareVariables(variables); } @Override public long deletePersistentAll() { return instanceToBeDelegated.deletePersistentAll(); } @SuppressWarnings("unchecked") @Override public long deletePersistentAll(Map parameters) { return instanceToBeDelegated.deletePersistentAll(parameters); } @Override public long deletePersistentAll(Object... parameters) { return instanceToBeDelegated.deletePersistentAll(parameters); } @Override public Object execute() { return instanceToBeDelegated.execute(); } @Override public Object execute(Object p1, Object p2, Object p3) { return instanceToBeDelegated.execute(p1, p2, p3); } @Override public Object execute(Object p1, Object p2) { return instanceToBeDelegated.execute(p1, p2); } @Override public Object execute(Object p1) { return instanceToBeDelegated.execute(p1); } @Override public Object executeWithArray(Object... parameters) { return instanceToBeDelegated.executeWithArray(parameters); } @SuppressWarnings("unchecked") @Override public Object executeWithMap(Map parameters) { return instanceToBeDelegated.executeWithMap(parameters); } @Override public FetchPlan getFetchPlan() { return instanceToBeDelegated.getFetchPlan(); } @Override public boolean getIgnoreCache() { return instanceToBeDelegated.getIgnoreCache(); } @Override public PersistenceManager getPersistenceManager() { return instanceToBeDelegated.getPersistenceManager(); } @Override public Boolean getSerializeRead() { return instanceToBeDelegated.getSerializeRead(); } @Override public Integer getTimeoutMillis() { return instanceToBeDelegated.getTimeoutMillis(); } @Override public boolean isUnmodifiable() { return instanceToBeDelegated.isUnmodifiable(); } @SuppressWarnings("unchecked") @Override public void setCandidates(Collection pcs) { instanceToBeDelegated.setCandidates(pcs); } @SuppressWarnings("unchecked") @Override public void setCandidates(Extent pcs) { instanceToBeDelegated.setCandidates(pcs); } @SuppressWarnings("unchecked") @Override public void setClass(Class cls) { instanceToBeDelegated.setClass(cls); } @SuppressWarnings("unchecked") @Override public void setExtensions(Map extensions) { instanceToBeDelegated.setExtensions(extensions); } @Override public void setFilter(String filter) { instanceToBeDelegated.setFilter(filter); } @Override public void setGrouping(String group) { instanceToBeDelegated.setGrouping(group); } @Override public void setIgnoreCache(boolean ignoreCache) { instanceToBeDelegated.setIgnoreCache(ignoreCache); } @Override public void setOrdering(String ordering) { instanceToBeDelegated.setOrdering(ordering); } @Override public void setRange(long fromIncl, long toExcl) { instanceToBeDelegated.setRange(fromIncl, toExcl); } @Override public void setRange(String fromInclToExcl) { instanceToBeDelegated.setRange(fromInclToExcl); } @Override public void setResult(String data) { instanceToBeDelegated.setResult(data); } @SuppressWarnings("unchecked") @Override public void setResultClass(Class cls) { instanceToBeDelegated.setResultClass(cls); } @Override public void setSerializeRead(Boolean serialize) { instanceToBeDelegated.setSerializeRead(serialize); } @Override public void setTimeoutMillis(Integer interval) { instanceToBeDelegated.setTimeoutMillis(interval); } @Override public void setUnique(boolean unique) { instanceToBeDelegated.setUnique(unique); } @Override public void setUnmodifiable() { instanceToBeDelegated.setUnmodifiable(); } }
PersistenceManager のいくつかの newQuery() 系のメソッドは引数でエンティティの型を受け取っているので、それを利用すれば QueryExt<T> のような形でエンティティの型を渡すこともできそうですね。要検討ということで。
0 件のコメント:
コメントを投稿