4 Stimmen

Hibernate Query API und Java 1.5/Generics

Alle APIs in Hibernate stammen aus Version 1.4 und verwenden daher keine Java Generics.

Ich frage mich also, wie "sicher" das Folgende ist: (Vorbedingungen: Name Spalte ist vom Datentyp String, oder zumindest kompatibel zu String)

@SuppressWarnings("unchecked")
public List<String> getAll() {
    Query q = session.createQuery(
        "select name from Customers");
    return q.list();    
}

Aus der Queryi API (org.hibernate.Query.list()) javadoc.

"Gibt die Abfrageergebnisse als Liste zurück. Wenn die Abfrage mehrere Ergebnisse pro Zeile enthält, werden die Ergebnisse in einer Instanz von Object[] zurückgegeben. "

3voto

tpdi Punkte 33618

Java-Generika verwenden eine Typauslöschung, so dass es zur Laufzeit keinen Unterschied zwischen einer List , a List<String> und eine List<Integer> . Alle sind wirklich nur List s. Bei der Kompilierung erzwingt der Compiler den Typ des Vorlagenparameters, aber zur Laufzeit haben Sie eine List .

Wenn Sie versuchen, mit Hilfe von Reflexion den Typ des Vorlagenparameters zu finden, können Sie das nicht.

3voto

newacct Punkte 114757

Es wird sicher sein, solange Sie sicher sind, dass die Abfrage nicht "mehrere Ergebnisse pro Zeile enthält". (Da ich mich mit Abfragen nicht auskenne, weiß ich nicht, ob dies in diesem Fall möglich ist). Wenn eine Zeile mehrere Ergebnisse enthält, wird bei dem Versuch, darauf zuzugreifen, zur Laufzeit eine ClassCastException ausgelöst, weil das Element ein Object[]-Objekt statt eines String-Objekts ist.

2voto

Lucero Punkte 57715

In Java sind Generika eigentlich Auslöschungen, was nichts anderes als Compiler-Magie ist. Die als generische Typargumente verwendeten Typen sind zur Laufzeit unbekannt. Daher sollte das Casting erfolgreich sein, wenn die zurückgegebene Liste die Schnittstelle List implementiert, aber der Compiler kann Sie mit Warnungen konfrontieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X