2009-06-05 7 views
24

Salut tout le monde, je suis nouveau à persistance/hibernation et j'ai besoin de votre aide.Persévérance Java: transtypage vers un résultat de Query.getResultList()?

Voici la situation. J'ai une table qui contient des choses. Appelons les personnes. Je voudrais obtenir toutes les entrées de la base de données qui sont dans cette table.

J'ai une classe de personne qui est un simple POJO avec une propriété pour chaque colonne dans la table (nom, âge, ..)

Voici ce que j'ai:

Query lQuery = myEntityManager.createQuery("from Person") 
List<Person> personList = lQuery.getResultList(); 

Cependant, je un avertissement disant que c'est une conversion non contrôlée de List à List<Person>

Je pensais que changer simplement le code à

Query lQuery = myEntityManager.createQuery("from Person") 
List<Person> personList = (List<Person>)lQuery.getResultList(); 

fonctionnerait .. mais ce n'est pas le cas.

Existe-t-il un moyen de le faire? La persistance me permet-elle de définir le type de retour de la requête? (Par le biais de génériques peut-être?)

Répondre

59

En tant que nouveau venu JPA prenait ce que la réponse définitive mais je l'ai trouvé un meilleur par cette question: Why in JPA EntityManager queries throw NoResultException but find does not?

est aussi simple que l'utilisation comme TypedQuery au lieu de la requête, par exemple:

TypedQuery<Person> lQuery = myEntityManager.createQuery("from Person", Person.class); 
List<Person> personList = lQuery.getResultList(); 
+0

Monsieur, vous m'avez donné la meilleure réponse. Je vous remercie. ++++ 1 –

1

J'ai été bloqué avec ce problème pendant un moment, aussi. Vous pouvez parcourir la liste et vérifier, mais je préférerais moins de bruit. Le moyen le plus court que j'ai vu de contourner cela est de faire taire l'avertissement, mais je suis aussi très mal à l'aise avec cela. Je serais intéressé de voir d'autres solutions.

@SuppressWarnings("unchecked") 
List<Person> personList = lQuery.getResultList(); 

Hmm, en faisant des recherches que j'ai trouvé un post intéressant sur java.net. J'ai trouvé les commentaires des utilisateurs particulièrement intéressants.

2

Eh bien, il est la solution Collections java class, mais vous n'a pas expliqué comment votre casting a été un échec, ou si elle était juste de donner un avertissement ...

C'est une façon de valider ceci:

Collections.checkList(lQuery.getResultList(), Person.class); 

Mais si vous n'avez pas besoin de le valider:

@SuppressWarnings("unchecked") List<Person> personList = lQuery.getResultList(); 
+0

Je n'expliquait comment mon casting a été un échec parce qu'elle ne parvient pas. Il ne fait simplement pas taire l'avertissement .. donc il ne fait rien. – GuiSim

9

note: Cette réponse est obsolète au JPA 2.0, qui vous permet de spécifier le typ prévu e. Voir this answer.


l'avertissement avec Réprimant

@SuppressWarnings("unchecked") 
List<MyType> result = (List<MyType>) query.getResultList(); 

est la seule solution à ce problème que j'ai jamais vu. La suppression est laide, mais vous pouvez faire confiance à JPA pour retourner le bon type d'objet, il n'est donc pas nécessaire de vérifier manuellement.

Si vous utilisez polymorphismes et ne connaissez pas le type exact de résultat, l'utilisation des médicaments génériques avec un paramètre Class borné est également un modèle commun:

public List<T extends MyBaseType> findMyType(Class<T> type) { 
    @SuppressWarnings("unchecked") 
    List<T> result = (List<T>) this.entityManager.createQuery(
     "FROM " + type.getName()) 
     .getResultList(); 
    return result; 
} 
1

manière alternative:

Query query = entityManager.createNativeQuery("SELECT * FROM person", Person.class); 
List<Person> rows = query.getResultList();