Hibernate Cast [Ljava.lang.Object; cannot be cast to Data.Data.TeilAufgabe

luigied

Mitglied
Hi,

ich habe in meinem EJB3-Projekt 2 Klassen Oberaufgabe und TeilAufgabe, die beide von der gleichen Klasse Aufgabe erben, also in der selben Tabelle TBL_Aufgabe gespeichert werden. Jetzt möchte ich nur die TEilAufgaben, die einem bestimmten Projekt zugeordnet sind (Spalte Project_id) aus der Tabelle lesen.

Meine Methode sieht, wie folgt aus:
Code:
public List<TeilAufgabe> getTA(Project pro){
		List<TeilAufgabe> TAs=null;
		List<Object> auList;
		//Query qu = entityManager.createQuery("Select Objact(ta) from Aufgabe ta where ta.project =?1");
		Query nqu = entityManager.createNativeQuery("Select * from TBL_AUFGABE where project_id="+augewaehltesPro.getId()+
				                                    " and dtype='TeilAufgabe'");
		auList = nqu.getResultList();
		while(auList.iterator().hasNext()){
			TAs.add((TeilAufgabe) auList.iterator().next());
		}
		System.out.println(TAs);
		return TAs;
	}

Leider bekomme ich bei dem cast auf TeilAufgabe in der while-Schleife eine Exception:
Caused by: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to Data.Data.TeilAufgabe
at Data.Logic.ProjectBean.getTA(ProjectBean.java:134) ...

Weiss einer, was ich hier falsch mache, bzw. warum der Cast nicht funktioniert?

Danke im Vorraus

LuigiEd
 
Hallo,

normal muss doch da wo du Objact (ich denke das soll Object heißen) stehen hast, der Variablen-Name stehen, die du von dem Object haben möchtest.

Gruß

Sascha
 
Die obere Query ist auskommentiert, weil dieser Versuch auch nicht funktioniert hatte. Allerdings kann es wirklich an meinem Tippfehler liegen. :D Die Idee zu dieser Syntax habe ich aus dem Hibernate-Forum.
Allerdings war das Problem da etwas anders.

Danke für die schnelle Antwort
 
Hab übersehen, dass die erste Zeile auskommentiert ist. In welcher Zeile kommt denn der Fehler?

Gruß

Sascha
 
Ok. DAS Problem habe ich jetzt gelöst. (normaler HQL-Query ohne Tippfehler ;)) Allerdings habe ich jetzt Probleme mit der Vererbung. Ich wollte die Überprüfung, ob ein zurückgeliefertes Aufgabe-Objekt eine Teilaufgabe ist, über den instaceof-Operator realisieren. Das scheint aber nicht zu funktionieren.

Aktueller Methoden-Code:
Code:
public List<TeilAufgabe> getTA(Project pro){
		List<TeilAufgabe> TAs=null;
		List<Object> auList;
		Query qu = entityManager.createQuery("Select Object(ta) from Aufgabe ta where ta.project =?1");
		qu.setParameter(1, augewaehltesPro);
		auList = qu.getResultList();
		System.out.println(auList.size());
		
		while(auList.iterator().hasNext()){
			Aufgabe a = (Aufgabe) auList.iterator().next();
			if(a instanceof TeilAufgabe){
				TeilAufgabe ta = (TeilAufgabe) a;
				System.out.println(ta.getId());
			    TAs.add(ta); 
			}
		}
		System.out.println(TAs);
		return TAs;
	}

Weiss einer, wie ich die Überprüfung mache?

Danke
 
Hast du mal durch debugged und geschaut warum er nicht in die if-Anweisung geht?

Sonst könntest du es auch so machen.
Code:
TeilAufgabe.class.isAssignableFrom(a.getClass())

Gruß

Sascha
 
Hab es zwar noch nicht gedebuggt (hässliches Wort), aber ich vermute, dass Hibernate da ein AufgabenObjekt aus der DB holt (ist ja fast logisch :D)

Soweit ich die Methode isAssignableForm verstehe, funktioniert das nur, wenn due Aufrufende Klasse eine Superklasse des Parameters ist. Bei mir ist es ja umgedreht. :(

Danke dir schonmal
 
Stimmt, sorry, hab ich gerade gar nicht bedacht.

Schau doch mal nach, von welcher Klasse das Object ist.

Gruß

Sascha
 
Ok, das war mir jetzt zu doof :D Ich habe jetzt in der Superklasse den InheritanceType auf TABLE_PER_CLASS gesetzt statt auf Single_table. Dann muss man bei der ID der Superklasse @GeneratedValue(strategy = GenerationType.TABLE) setzen und kann bei der Abfrage schön über die Tabelle TEilAufgabe gehen und spart sich den Cast. XD

Warum umständlich, wenn es auch einfach geht. ;)

Danke dir trotzdem für deine Geduld
 
Zurück