Oracle Vector zu ArrayList casten (.getResultList())

ManuX

Mitglied
Hallo Leute,

ich bin neu hier im Forum und dank Google auf das Forum gestoßen :)

Hab das folgende Problem tagelang gegoogelt aber ohne Erfolg, nun versuch ichs hier:

Ich benutze Hibernate und Eclipse Indigo (neueste Version) mit Eclipse Link (auf Windows). Java Version müsste JDK 1.7 sein.

Das Problem ist, wenn das Programm ausgeführt wird erzeugt es mir einen Fehler wie
"java.util ... cannot cast Vector to ArrayList", wenn ich es also zu einem Vector caste funktionierts teilweise.
Allerdings wenn ich es auf der Hochschul VM (linux) mit der Bash kompiliere funktioniert es tadellos. Habe es aber noch nicht mit dem dortigen Eclipse versucht.
Der Witz ist, dass es eigentlich ein Musterprogramm ist und daher dort auch läuft (HS).

Hier ist eine Methode
Java:
public Collection<Project> list() {
      Query query = em.createQuery( "SELECT p from Project p" );
      Collection<Project> projectCollection = new ArrayList<Project>();
      for ( Project project : (ArrayList<Project>)query.getResultList() )
         projectCollection.add( project );
      return projectCollection;
   }

Und die Problemstelle
Java:
 for ( Project project : (ArrayList<Project>)query.getResultList() )


Ich bin wirklich für jede Hilfe dankbar ;)

Grüße
ManuX
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
getResultList() liefert doch das List-Interface zurück, oder?
warum castest du auf eine bestimmte Subklasse, ob ArrayList, Vector oder sonst eine List,
schreibe (List<Project>) dann gehts für alle gleich gut,

für deinen Durchlauf ist es doch egal welche List..
 

ManuX

Mitglied
Natürlich funktioniert es für eine einzelne Abfrage mit List.
Aber es sind mehrere Klassen und mehere Manager-Klassen, wenn ich also z.B. alleAbteilungen (soll Projekte, Mitarbeiter, Abteilungen, Bankdaten ausgeben) erscheint wenn ich die dafür vorgesehene Klasse(Beziehung ...) in eine toString()-Methode z.B. getAllProjects() schreibe gibt Eclipse mir aus

Code:
{IndirectList: not instantiated}
Anstelle der Projekte. Und wie gesagt ich verstehe einfach nicht warum es auf dem HS-Server funktioniert und bei mir daheim nicht.
 
S

SlaterB

Gast
beim DB-Zugriff kann es in der Tat recht exotische Ergebnislisten geben,
so wie es für den Treiber intern günstig ist, wenn ein Objekt dort mit get geholt wird, wird das vielleicht erst noch initialisiert,

dich muss nur interessieren dass es eine Liste ist und die normalen Aufrufe wohl funktionieren werden,
wenn du unbedingt eine bestimmte Liste haben willst, dann kopiere die Daten z.B. in ein neues ArrayList-Objekt

was rede ich, das machst du mit projectCollection ja auch gerade ;)
da du also im weiteren nur mit deiner eigenen Collection arbeiten wirst, kann es dir doch besonders herzlich egal sein,
wie der DB-Treiber oder das Hibernate-Framework die Ergenisse anliefert,

ich kann mir durchaus auch vorstellen, dass das auf verschiedenen Rechnern, oder selber in einem Programm z.B. je nach vorhandenen Cache-Daten unterschiedlich ist,

was genau ist jetzt deine Frage, der Zugriff klappt? dir geht es nur noch darum was konkret getResultList() liefert und warum?
mehr kann ich wohl nicht beitragen

edit:
"{IndirectList: not instantiated}" kann man suchen
https://forums.oracle.com/forums/thread.jspa?threadID=171733

aber du musst ja nun nicht toString() einer unbekannten Liste aufrufen..,
kopiere in deine Collection (sonst nix) und ab da nur diese verwenden
 

ManuX

Mitglied
Ja, also der Zugriff an sich klappt ja,
ich habe eigentlich nur 2 Fragen und zwar,
1.
warum gibt
Java:
(ArrayList<Project>)query.getResultList()
bei mir Daheim einen Kompilierfehler und auf dem HS-Server nicht

2. "{IndirectList: not instantiated}" den Link hab ich auch gefunden, jedoch wenn ich es richtig verstanden habe kein Fehler ist.
 
S

SlaterB

Gast
weil es nicht ganz klar klingt als Rückmeldung, die nicht unbedingt neues enthält:
1.
ich schrieb bereits
ich kann mir durchaus auch vorstellen, dass das auf verschiedenen Rechnern, oder selber in einem Programm z.B. je nach vorhandenen Cache-Daten unterschiedlich ist,
je nach Datenbank (lokal oder entfernt), je nach Datenbank- und Programmeinstellungen, je nach Betriebssystem und dann offensichtlich anderen Treibern usw., je nach Programmzustand kann das anders reagieren,

genau einleutende Details kann ich abgesehen von wirklich offensichtlichen DB-Einstellungen (lazy loading oder direkt laden) nicht nennen

2.
kein Fehler, richtig,
eine Frage von dir sehe ich da nicht, falls du nicht allein diese Bestätigung suchst
 

ManuX

Mitglied
Zu 1.

Klar ich hab dein Post schon verstanden auch mit den DB-Einstellungen/Programmeinstellungen aber es handelt sich ja in diesem Fall "nur", um ein Java Problem, und da Java ja auf einer eigenen VM läuft, kann ich es mir wirklich nicht vorstellen, wieso es mir den Fehler anzeigt (habe auch normale Projekte erstellt und versucht von Vector/List zu casten wieder aufgetreten) ?

Ich sollte vllt erwähnen, dass ich genau die Eclipse Version der HS verwende zumindest von den Windows Rechnern.

Zu 2.
Ja war keine Frage hast du schon richtig verstanden ;) , allerdings lässt sich sowas gar nicht vermeiden?

Ich weiß ich bin schwierig, aber das Problem geht mir echt auf die Nerven und hält mich vom eigentlichen ab :(

Grüße
 
S

SlaterB

Gast
der Cast ist ein Java-Problem, aber warum einmal die eine Liste und einmal die andere kommt (falls es überhaupt so ist) kann an allen möglichen in der Kette liegen
 

ManuX

Mitglied
Du hast aber leider auch keine Idee wie das Cast-Problem zu lösen ist?

Denn eigentlich gibt ja
Java:
query.getResultList()
eine "List" zurück, warum das dann zum Vector umgemodelt wird, keine Ahnung.

Is doch nich normal oder ? :)
 
S

SlaterB

Gast
ein Vector IST eine List,
da wird nichts umgemodelt, abgesehen davon dass es verschiedene List-Arten gibt,
Vector passt absolut zum Rückgabetyp, du könntest das problemlos durchlaufen,
alles bestens, die interne Wahl der List ist irrelevant

mit Cast-Problem meinte ich, dass du unbedingt eine bestimmte List-Art haben willst und das auf einem Rechner auch geht, auf den nächsten nicht,
mit korrekter Bedienung gibt es kein Problem
 

ManuX

Mitglied
Klar ist Vector eine List aber ich meinte halt den Datentyp List.

Nun gut, das ist Schade, dass das so Stimmungsabhängig ist mit dem Casten aber seis drum.

Danke für deine Hilfe

Grüße
 

Fant

Bekanntes Mitglied
Klar ist Vector eine List aber ich meinte halt den Datentyp List.

Code:
List
ist ein Interface und Vektor eine Klasse, die dieses Interface implementiert. Ich hab die Befürchtung, dass dir da der Unterschied gar nicht wirklich klar ist?

Von einem Interface kannst du nicht direkt ein Objekt erstellen, sondern ein solches
Code:
List
-Objekt muss immer vom Typ einer Klasse sein, welche das
Code:
List
-Interface implementiert.

Von der Methode
Code:
getResultList()
weißt du nur, dass du irgendein Objekt bekommst, dessen Klasse das Interface
Code:
List
implementiert. Du kannst einfach nicht erwarten, dass du da immer ein Objekt gleichen Typs bekommst. Das einzige, was du sicher weißt, ist, dass das übergebene Objekt alle Methoden bereitstellt, die
Code:
List
eben mitliefert.
Du willst eine
Code:
List
und du bekommst eine. Ob das nun aber tatsächlich ein
Code:
Vector
, eine
Code:
ArrayList
, eine
Code:
AbstractSequentialList
oder sonst was, darauf hast du keinen Einfluss.
 

Ähnliche Java Themen

Neue Themen


Oben