web-dev-qa-db-fra.com

Java Persistance: Cast en quelque chose du résultat de Query.getResultList ()?

Salut tout le monde, je suis nouveau dans la persistance/hibernation et j'ai besoin de votre aide.

Voici la situation. J'ai un tableau qui contient des choses. Appelons-les des personnes. J'aimerais obtenir toutes les entrées de la base de données qui se trouvent dans cette table.

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

Voici ce que j'ai:

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

Cependant, je reçois un avertissement disant qu'il s'agit d'une conversion non vérifiée de List en List<Person>

Je pensais que changer simplement le code en

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

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

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

31
GuiSim

En tant que nouveau venu dans JPA, je prenais cela comme la réponse définitive, mais j'en ai trouvé une meilleure via cette question: Pourquoi dans les requêtes JPA EntityManager lancent NoResultException mais ne trouve pas?

C'est aussi simple que d'utiliser TypedQuery au lieu de Query, par exemple:

TypedQuery<Person> lQuery = myEntityManager.createQuery("from Person", Person.class);
List<Person> personList = lQuery.getResultList();
70
Bruce Adams

Remarque: Cette réponse est obsolète depuis JPA 2.0, ce qui vous permet de spécifier le type attendu. Voir cette réponse .


Suppression de l'avertissement avec

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

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

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

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;
}
9
Henning

Eh bien, il y a la solution de classe Java Collections), mais vous n'avez pas expliqué en quoi votre casting échouait, ou s'il ne faisait que 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();
2
Petriborg

Méthode alternative:

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

Je suis également coincé avec ce problème depuis un certain temps. Vous pouvez parcourir la liste et vérifier, mais je préfère moins de bruit. Le moyen le plus court que j'ai vu pour contourner ce problème est de faire taire l'avertissement, mais je suis également 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 recherchant, j'ai trouvé un post intéressant sur Java.net. J'ai trouvé les commentaires des utilisateurs particulièrement intéressants.

1
Charlie