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 » ..?

Était-ce utile?

La solution

  1. 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.

  2. 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];
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top