Wie zu verwenden JOIN mithilfe der Hibernate - session.createSQLQuery()
Habe ich zwei Entitäten (Tabellen) - Mitarbeiter & Projekt. Ein Mitarbeiter kann mehrere Projekte haben.
Projekt Tabelle CREATOR_ID Feld bezieht sich auf die Tabelle Employee die ID-Feld. Employee-Entität nicht pflegen keine Referenz für das Projekt - aber das Projekt Entität ist eine Referenz für Mitarbeiter.
Mit EntityManager folgende Abfrage funktioniert einwandfrei -
entityManager.createQuery(
"select e from EmployeeDTO e, ProjectDTO p"
+ " where p.id = ?1 and p.creator.id=e.id");
Aber da habe ich die LAZY-Verein-Beziehung, bekomme ich Fehler:
Konnte nicht initialisiert werden proxy - keine
Sitzung
wenn ich versuche, Zugriff auf Projekt-Informationen von Employee-Entität. Dies ist zu erwarten und so bin ich mit Hibernate die Session zu erstellen, die Abfrage, wie unten dargestellt.
Session session = HibernateUtil.getSessionFactory().openSession();
org.hibernate.Query q = session.createSQLQuery(
"SELECT E FROM EMPLOYEE_TAB E, PROJECT_TAB P WHERE P.ID = "
+ projectId + " AND P.CREATOR_ID = E.ID")
.addEntity("EmployeeDTO ", EmployeeDTO.class)
.addEntity("ProjectDTO", ProjectDTO.class);
Aber ich bekomme Fehler wie: "Spalte 'E' ist in keiner Tabelle der FROM-Liste erscheint oder
innerhalb eines join-Spezifikation und ist außerhalb des Bereichs der join-Spezifikation,..."
Kann jeder jeden schlagen, was die richtige JOIN-syntax für einen solchen Fall? Wenn ich ("SELECT * FROM EMPLOYEE_TAB E, ........")
es gibt andere Fehler:
java.lang.Classcastexception-Fehler:
[Ljava.lang.Object; cannot be cast to
com.im.server.dto.EmployeeDTO
.
Vielen Dank im Voraus.
InformationsquelleAutor javauser71 | 2011-01-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Brauchen Sie nicht, um eine native SQL-Abfrage, um prefetch -
ProjectDTO
s beim ladenEmployeeDTO
. Ihre ursprüngliche Abfrage umgeschrieben werden kann in eleganter Weise wie folgt:Dann können Sie eine
join fetch
- Klausel, um die prefetch-Projekte:Siehe auch:
Mein Fehler ! Ich war mit "session.createSQLQuery (...)", während ich, sollte "session.createQuery(...)". Vielen Dank für den richtigen Tipp. Cheers,
InformationsquelleAutor axtavt
Ihre SQL beginnt mit
SELECT E from EMPLOYEE E ...
, meinst duSELECT E.*, P.* from EMPLOYEE E ...
?InformationsquelleAutor Andy Skirrow