2010-02-16 8 views
3

J'ai suivi un exemple JPA de travail pour récupérer des objets de catégorie en tant que tels:requête JPQL SELECT en option + DAO générique sélectionner

return (ArrayList<Category>) getEntityManager().createQuery("from Category").getResultList(); 

La requête est très abrégée - et je ne peux pas trouver les règles pour ce qui est facultatif et ce qui n'est dans aucun des guides. Cette brièveté est-elle acceptable?

Deuxièmement, 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 "..?

Répondre

5
  1. Oui, la brièveté est acceptable. Bien que je préfère la syntaxe complète, car il est plus "attrayant" pour les autres qui ont plus d'expérience SQL.

  2. Vous devez ajouter un paramètre Class<E> à votre DAO:

    public List<E> getAll(Class<E> entityClass) { 
        Query query = enittyManager.createQuery("from " + entityClass.getName()); 
        query.getResultList(); 
    } 
    
+0

merci pour la pointe, je reçois le nom de classe dans le constructeur du dao générique et en utilisant cette variable dans la requête! – Mobs

+0

@Mobs bien :) btw, réponses acceptées avec 0 upvotes look bizarre;) – Bozho

2

fait, vous ne devez pas utiliser un paramètre de méthode, mais peut utiliser la réflexion.

Example Code using Reflection

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]; 
    } 
} 
Questions connexes