requête JPQL SELECT DAO en option + générique sélectionnez
Question
J'ai suivi un exemple JPA de travail pour récupérer des objets de catégorie en tant que tels:
return (ArrayList<Category>) getEntityManager().createQuery("from Category").getResultList();
La requête est très raccourci - et je ne peux pas trouver les règles pour ce qui est facultatif et ce qui est pas dans l'un des guides. Est-ce acceptable brièveté?
En second lieu, je veux mettre en œuvre maintenant cela dans un générique DAO, quelque chose comme:
public interface DAO<E, K>
{
List<E> getAll();
}
Comment puis-je réécrire la première requête de travailler pour tous les types que je ne peux pas le coder en dur « de la catégorie » ..?
La solution
-
Oui, la brièveté est acceptable. Bien que je préfère la syntaxe complète car il est plus « attrayante » à d'autres qui ont plus d'expérience SQL.
-
Vous devez ajouter un paramètre
Class<E>
à votre OAC:public List<E> getAll(Class<E> entityClass) { Query query = enittyManager.createQuery("from " + entityClass.getName()); query.getResultList(); }
Autres conseils
Vous n'avez pas fait d'utiliser un paramètre de méthode, mais peut utiliser la réflexion.
Exemple de code utilisant la réflexion
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];
}
}