Par exemple, j'ai une telle requête:
Query q = sess.createQuery("from Cat cat");
List cats = q.list();
Si j'essaye de faire quelque chose comme ça, ça affiche l'avertissement suivant
Type safety: The expression of type List needs unchecked conversion to conform to List<Cat>
List<Cat> cats = q.list();
Y a-t-il un moyen de l'éviter?
sess.createQuery("from Cat cat", Cat.class);
comme Elazar l'a mentionné.Réponses:
Utiliser
@SuppressWarnings
partout, comme suggéré, est un bon moyen de le faire, même si cela implique un peu de frappe du doigt chaque fois que vous appelezq.list()
.Il y a deux autres techniques que je suggère:
Ecrire un assistant de casting
Refactorisez simplement tout votre
@SuppressWarnings
en un seul endroit:Empêcher Eclipse de générer des avertissements pour des problèmes inévitables
Dans Eclipse, allez dans Fenêtre> Préférences> Java> Compilateur> Erreurs / Avertissements et sous Type générique, cochez la case
Ignore unavoidable generic type problems due to raw APIs
Cela désactivera les avertissements inutiles pour des problèmes similaires tels que celui décrit ci-dessus qui sont inévitables.
Certains commentaires:
Query
au lieu du résultat deq.list()
parce que de cette façon, cette méthode de "triche" ne peut être utilisée que pour tricher avec Hibernate, et non pour tricherList
en général..iterate()
etc.la source
Collections.checkedList()
méthode ne surpressera pas l'avertissement d'affectation non cochée.Cela fait longtemps que la question n'a pas été posée, mais j'espère que ma réponse pourra être utile à quelqu'un comme moi.
Si vous jetez un œil à la documentation de l' API javax.persistence , vous verrez que de nouvelles méthodes y ont été ajoutées depuis
Java Persistence 2.0
. L'un d'eux est celuicreateQuery(String, Class<T>)
qui revientTypedQuery<T>
. Vous pouvez utiliserTypedQuery
comme vous l'avez faitQuery
avec cette petite différence que toutes les opérations sont de type sécurisé maintenant.Alors, changez simplement votre code en smth comme ceci:
Et vous êtes prêt.
la source
Nous l'utilisons
@SuppressWarnings("unchecked")
aussi, mais nous essayons le plus souvent de l'utiliser uniquement sur la déclaration de la variable, pas sur la méthode dans son ensemble:la source
Essayez d'utiliser à la
TypedQuery
place deQuery
. Par exemple au lieu de ceci: -Utilisez ceci:-
la source
Criteria
cependant?Dans notre code, nous annotons les méthodes d'appel avec:
@SuppressWarnings ("non coché")
Je sais que cela ressemble à un hack, mais un co-développeur a vérifié récemment et a trouvé que c'était tout ce que nous pouvions faire.
la source
Apparemment, la méthode Query.list () dans l'API Hibernate n'est pas sûre de type "par conception", et il n'est pas prévu de la changer .
Je pense que la solution la plus simple pour éviter les avertissements du compilateur est en effet d'ajouter @SuppressWarnings ("non coché"). Cette annotation peut être placée au niveau de la méthode ou, si elle est à l'intérieur d'une méthode, juste avant une déclaration de variable.
Si vous avez une méthode qui encapsule Query.list () et renvoie List (ou Collection), vous obtenez également un avertissement. Mais celui-ci est supprimé en utilisant @SuppressWarnings ("rawtypes").
La méthode listAndCast (Query) proposée par Matt Quail est moins flexible que Query.list (). Bien que je puisse faire:
Si j'essaye le code ci-dessous:
J'obtiendrai une erreur de compilation: Incompatibilité de type: impossible de convertir de List en ArrayList
la source
Ce n'est ni un oubli ni une erreur. L'avertissement reflète un réel problème sous-jacent - il n'y a aucun moyen que le compilateur java puisse vraiment être sûr que la classe hibernate fera son travail correctement et que la liste qu'elle renvoie ne contiendra que des chats. Toutes les suggestions ici sont très bien.
la source
Non, mais vous pouvez l'isoler dans des méthodes de requête spécifiques et supprimer les avertissements avec une
@SuppressWarnings("unchecked")
annotation.la source
Les versions plus récentes d'Hibernate prennent désormais en charge un
Query<T>
objet de type sécurisé , vous n'avez donc plus besoin d'utiliser@SuppressWarnings
ou d'implémenter un hack pour faire disparaître les avertissements du compilateur. Dans l' API de session ,Session.createQuery
renvoie désormais unQuery<T>
objet de type sécurisé . Vous pouvez l'utiliser de cette façon:Vous pouvez également l'utiliser lorsque le résultat de la requête ne renvoie pas de Cat:
Ou lors d'une sélection partielle:
la source
Nous avons eu le même problème. Mais ce n'était pas un gros problème pour nous car nous devions résoudre d'autres problèmes plus importants avec Hibernate Query and Session.
Plus précisément:
Donc pour nous, nous avons:
Et enfin,
AmplafiQuery a un "asList ()" qui est une version générique activée de Query.list () AmplafiQuery a un "unique ()" qui est une version générique activée de Query.uniqueResult () (et enregistre simplement un problème plutôt que de lancer un exception)
C'est beaucoup de travail pour éviter les @SuppressWarnings. Cependant, comme je l'ai dit (et répertorié), il y a beaucoup d'autres meilleurs! raisons de faire le travail d'emballage.
la source
Je sais que c'est plus ancien, mais 2 points à noter à partir d'aujourd'hui dans Matt Quails Answer.
Point 1
Ce
Devrait être ça
Point 2
De cela
pour ça
réduirait évidemment d'autres avertissements dans les marqueurs de balise de réponse d'origine supprimés par le navigateur.
la source
Essaye ça:
la source
cat
instance.Une bonne solution pour éviter les avertissements de sécurité de type avec la requête de mise en veille prolongée consiste à utiliser un outil tel que TorpedoQuery pour vous aider à créer un hql de type sécurisé.
la source
la source
Si vous ne souhaitez pas utiliser @SuppressWarnings ("non coché"), vous pouvez faire ce qui suit.
FYI - J'ai créé une méthode util qui fait cela pour moi afin qu'elle ne gâche pas mon code et je n'ai pas à utiliser @SupressWarning.
la source