2011-01-14 5 views
1

Ich habe zwei Entität (Tabellen) - Mitarbeiter & Projekt. Ein Mitarbeiter kann mehrere Projekte haben. Das CREATOR_ID-Feld der Projekttabelle verweist auf das ID-Feld der Employee-Tabelle. Employee-Entität behält keine Referenz für Project bei, aber Project entity hat eine Referenz für Employee.Wie verwendet man JOIN mit Hibernate session.createSQLQuery()

Mit EntityManager Abfrage folgende funktioniert gut -

entityManager.createQuery(
    "select e from EmployeeDTO e, ProjectDTO p" 
    + " where p.id = ?1 and p.creator.id=e.id"); 

Da ich aber die Faulen Assoziationsbeziehung haben, bekomme ich Fehler:

Could not initialize proxy - no Session

wenn ich versuche, Informationen von Unternehmen Mitarbeiter Projekt zuzugreifen. Dies wird erwartet und daher verwende ich die Hibernate-Sitzung, um die Abfrage wie unten gezeigt zu erstellen.

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 entweder nicht in einer Tabelle in der FROM-Liste oder erscheint innerhalb einer Spezifikation verbinden und ist außerhalb des Bereichs der Spezifikation kommen ...“

Kann jemand vorschlagen, was die richtige JOIN-Syntax für einen solchen Fall sein wird? Wenn ich ("SELECT * FROM EMPLOYEE_TAB E, ........") verwenden - gibt es andere Fehler:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.im.server.dto.EmployeeDTO

.

Vielen Dank im Voraus.

Antwort

1

Sie müssen keine native SQL-Abfrage verwenden, um ProjectDTO s beim Laden von EmployeeDTO vorzuladen. Ihre ursprüngliche Abfrage kann in eleganter Weise wie folgt geschrieben werden:

select e from EmployeeDTO e join e.projects p where p.id = ?1 

Dann können Sie eine join fetch Klausel hinzufügen, um die Projekte zu Prefetch:

select distinct e from EmployeeDTO e join e.projects p join fetch e.projects where p.id = ?1 

Siehe auch:

+0

Ich erhalte einen Fehler: "Syntaxfehler: aufgetreten" wo "in Zeile 1, Spalte 52" für beide Fälle. Für den ersten Fall war meine Abfrage: "SELECT DISTINCT P FROM Projekt DTO P beitreten P.creator mit P.id = 1". Der "Ersteller" ist ein Mitglied der Klasse "ProjectDTO" des Typs "EmployeeDTO". – javauser71

+0

Mein Fehler! Ich habe "session.createSQLQuery (...)" verwendet, während ich "session.createQuery (...)" hätte verwenden sollen. Danke für den richtigen Vorschlag. Prost, – javauser71

0

Ihr SQL beginnt mit SELECT E from EMPLOYEE E ..., meinen Sie SELECT E.*, P.* from EMPLOYEE E ...?

+0

Nein - "SELECT E FROM EMPLOYEE ..." sollte alle Eigenschaften von Employee entity/table abrufen. – javauser71