interrogazione JPQL SELEZIONA DAO opzionale + generica selezionare
Domanda
Ho seguito un JPA esempio di lavoro per recuperare oggetti Categoria in quanto tale:
return (ArrayList<Category>) getEntityManager().createQuery("from Category").getResultList();
La query è molto stenografia - e non riesco a trovare le regole per ciò che è opzionale e ciò che non è in nessuna delle guide. È questo brevità accettabile?
In secondo luogo, voglio attuare ora questo in un DAO generica, qualcosa come:
public interface DAO<E, K>
{
List<E> getAll();
}
Come posso riscrivere la prima query di lavorare per tutti i tipi come non posso hardcode il "dalla categoria" ..?
Soluzione
-
Sì, la brevità è accettabile. Anche se io preferisco la sintassi completa, perché è più "attraente" per altri che hanno più esperienza di SQL.
-
È necessario aggiungere un parametro
Class<E>
al tuo DAO:public List<E> getAll(Class<E> entityClass) { Query query = enittyManager.createQuery("from " + entityClass.getName()); query.getResultList(); }
Altri suggerimenti
In realtà non c'è bisogno di utilizzare un parametro di metodo, ma è possibile utilizzare la riflessione.
Esempio di codice utilizzando la riflessione
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class<T> DAO {
protected Class<T> clazz;
public DAO()
{
Type genericSuperclass = getClass().getGenericSuperclass();
// Allow this class to be safely instantiated with or without a parameterized type
if (genericSuperclass instanceof ParameterizedType)
clazz = (Class<T>) ((ParameterizedType) genericSuperclass).getActualTypeArguments()[0];
}
}