Zum Beispiel habe ich eine solche Abfrage:
Query q = sess.createQuery("from Cat cat");
List cats = q.list();
Wenn ich versuche, so etwas zu machen, wird die folgende Warnung angezeigt
Type safety: The expression of type List needs unchecked conversion to conform to List<Cat>
List<Cat> cats = q.list();
Gibt es eine Möglichkeit, dies zu vermeiden?
sess.createQuery("from Cat cat", Cat.class);
wie Elazar erwähnte.Antworten:
Unter Verwendung
@SuppressWarnings
überall, wie vorgeschlagen, ist ein guter Weg , es zu tun, obwohl es ein wenig Fingers mit sich bringt jedes Mal eingeben Sie anrufenq.list()
.Es gibt zwei andere Techniken, die ich vorschlagen würde:
Schreiben Sie einen Cast-Helfer
Refaktorieren Sie einfach alles
@SuppressWarnings
an einem Ort:Verhindern Sie, dass Eclipse Warnungen für unvermeidbare Probleme generiert
Gehen Sie in Eclipse zu Fenster> Einstellungen> Java> Compiler> Fehler / Warnungen und aktivieren Sie unter Generischer Typ das Kontrollkästchen
Ignore unavoidable generic type problems due to raw APIs
Dadurch werden unnötige Warnungen für ähnliche Probleme wie das oben beschriebene deaktiviert, die unvermeidbar sind.
Einige Kommentare:
Query
anstelle des Ergebnisses von zu übergeben,q.list()
weil auf diese Weise diese "Betrugs" -Methode nur zum Betrügen mit dem Ruhezustand verwendet werden kann und nicht zum BetrügenList
im Allgemeinen..iterate()
usw. hinzufügen .quelle
Collections.checkedList()
Methode unterdrückt die ungeprüfte Zuweisungswarnung nicht.Es ist lange her, dass die Frage gestellt wurde, aber ich hoffe, meine Antwort könnte für jemanden wie mich hilfreich sein.
Wenn Sie sich die API-Dokumente von javax.persistence ansehen , werden Sie feststellen , dass seitdem einige neue Methoden hinzugefügt wurden
Java Persistence 2.0
. Eine davon istcreateQuery(String, Class<T>)
die, die zurückkehrtTypedQuery<T>
. Sie könnenTypedQuery
genau so verwenden, wie Sie es getan haben, mitQuery
dem kleinen Unterschied, dass alle Vorgänge jetzt typsicher sind.Ändern Sie einfach Ihren Code wie folgt:
Und Sie sind fertig.
quelle
Wir verwenden es
@SuppressWarnings("unchecked")
auch, aber wir versuchen meistens, es nur für die Deklaration der Variablen zu verwenden, nicht für die Methode als Ganzes:quelle
Versuchen Sie es
TypedQuery
anstelle vonQuery
. Zum Beispiel stattdessen: -Benutze das:-
quelle
Criteria
?In unserem Code kommentieren wir die aufrufenden Methoden mit:
@ SuppressWarnings ("nicht markiert")
Ich weiß, es scheint ein Hack zu sein, aber ein Mitentwickler hat kürzlich nachgesehen und festgestellt, dass dies alles war, was wir tun konnten.
quelle
Anscheinend ist die Query.list () -Methode in der Hibernate-API "von Entwurf" nicht typsicher, und es gibt keine Pläne, sie zu ändern .
Ich glaube, die einfachste Lösung, um Compiler-Warnungen zu vermeiden, besteht darin, @SuppressWarnings hinzuzufügen ("nicht markiert"). Diese Annotation kann auf Methodenebene oder innerhalb einer Methode direkt vor einer Variablendeklaration platziert werden.
Wenn Sie eine Methode haben, die Query.list () kapselt und List (oder Collection) zurückgibt, erhalten Sie auch eine Warnung. Dieser wird jedoch mit @SuppressWarnings ("rawtypes") unterdrückt.
Die von Matt Quail vorgeschlagene listAndCast (Query) -Methode ist weniger flexibel als Query.list (). Während ich tun kann:
Wenn ich den folgenden Code versuche:
Ich erhalte einen Kompilierungsfehler: Typ stimmt nicht überein: Konvertiert nicht von List nach ArrayList
quelle
Es ist kein Versehen oder ein Fehler. Die Warnung spiegelt ein echtes zugrunde liegendes Problem wider - der Java-Compiler kann auf keinen Fall wirklich sicher sein, dass die Klasse im Ruhezustand ihre Aufgabe ordnungsgemäß erfüllt und dass die zurückgegebene Liste nur Katzen enthält. Jeder der Vorschläge hier ist in Ordnung.
quelle
Nein, aber Sie können es in bestimmte Abfragemethoden isolieren und die Warnungen mit einer
@SuppressWarnings("unchecked")
Anmerkung unterdrücken .quelle
Neuere Versionen von Hibernate unterstützen jetzt ein typsicheres
Query<T>
Objekt, sodass Sie keinen@SuppressWarnings
Hack mehr verwenden oder implementieren müssen, damit die Compiler-Warnungen verschwinden. In der Session - API ,Session.createQuery
wird nun eine Art sichere RückkehrQuery<T>
Objekt. Sie können es folgendermaßen verwenden:Sie können es auch verwenden, wenn das Abfrageergebnis keine Katze zurückgibt:
Oder wenn Sie eine Teilauswahl treffen:
quelle
Wir hatten das gleiche Problem. Aber es war keine große Sache für uns, weil wir andere größere Probleme mit Hibernate Query and Session lösen mussten.
Speziell:
Für uns haben wir also:
Und zuletzt,
AmplafiQuery hat eine "asList ()", eine generisch aktivierte Version von Query.list (). AmplafiQuery hat eine "unique ()", eine generisch aktivierte Version von Query.uniqueResult () (und protokolliert nur ein Problem, anstatt eine auszulösen Ausnahme)
Dies ist eine Menge Arbeit, um @SuppressWarnings zu vermeiden. Wie ich bereits sagte (und auflistete), gibt es jedoch viele andere bessere! Gründe für die Verpackungsarbeit.
quelle
Ich weiß, dass dies älter ist, aber ab heute sind in Matt Quails Answer 2 Punkte zu beachten.
Punkt 1
Dies
Sollte das sein
Punkt 2
Davon
dazu
würde andere Warnungen reduzieren, die offensichtlich in den ursprünglichen Antwort-Tag-Markierungen vom Browser entfernt wurden.
quelle
Versuche dies:
quelle
cat
Instanz tun müssen .Eine gute Lösung, um Warnungen vor Typensicherheit bei Abfragen im Ruhezustand zu vermeiden, ist die Verwendung eines Tools wie TorpedoQuery, mit dem Sie typsichere HQL erstellen können.
quelle
quelle
Wenn Sie @SuppressWarnings nicht verwenden möchten ("nicht markiert"), können Sie Folgendes tun.
Zu Ihrer Information - Ich habe eine util-Methode erstellt, die dies für mich erledigt, damit mein Code nicht verschmutzt wird und ich @SupressWarning nicht verwenden muss.
quelle