2010-02-05 6 views
21

Ich möchte mithilfe der Kriterien-API einen LEFT OUTER JOIN zwischen zwei Tabellen durchführen. Alles, was ich in der Hibernate Dokumentation ist diese Methode finden konnte: es gibt(Lazy) LEFT OUTER JOIN unter Verwendung der Hibernate Criteria-API

Criteria criteria = this.crudService 
      .initializeCriteria(Applicant.class) 
      .setFetchMode("products", FetchMode.JOIN) 
      .createAlias("products", "product"); 

Doch dies führt entweder eine innere Verknüpfung oder eine rechte äußere Verknüpfung, weil die Zahl der Ergebnisse.

Ich möchte auch meine beitreten zu Lazy sein. Wie kann ich das machen?

Prost!

UPDATE: Es scheint, dass die Verwendung von Aliasen die Verbindung INNER JOIN automatisch herstellt. Es gibt etwas in der "Hintergrundgeschichte", das ich noch nicht begriffen habe. Also, kein Alias ​​heute. Dies lässt mich mit dem Problem der Anwendung von Einschränkungen für die beiden Tabellen, weil sie beide eine Spalte (oder Eigenschaft, wenn dies geeigneter ist) 'Name'.

+2

bereits die Antwort übernehmen. –

+0

Ich möchte Sie Referenz von "createAlia() in Hibernate wissen, erstellt standardmäßig eine INNER JOIN". Ich habe die API durchsucht und kann sie nicht sehen. Vielen Dank. – FaithReaper

Antwort

0

Ein Join ist in der SQL-Anfrage. Es kann nicht faul sein.


Mit Hibernate, abzurufen lazily diese Daten, es nur aus dem Wunsch HQL auszuschließen. Wenn Sie dann auf die Getter Ihrer Entität zugreifen (wenn Ihre Sitzung noch geöffnet ist), wird sie automatisch geladen (Sie müssen diesen Teil der Anforderung nicht schreiben).

+0

Entschuldigung, ich habe das nicht verstanden. Vielleicht sollte ich neu formulieren: Ich möchte einen LINKEN ÄUSSEREN JOIN haben, aber ich möchte auch, dass die Daten tatsächlich nur bei Bedarf abgerufen werden (der entsprechende Getter wird aufgerufen). Ist Faulheit (oder Eifer) irgendwie mit dem Typ von SQL-JOIN verbunden, der stattfindet? –

+0

Faulheit kann mit Objekten realisiert werden, aber nicht mit einer SQL-Anfrage. Eine Anfrage wird einmal vollständig ausgeführt, sie ist nicht so ausgelegt, dass ein Teil der Anfrage später bei Bedarf ausgeführt wird! – KLE

+0

In HQL schreibe ich LEFT OUTER JOIN FETCH. Vermutlich entspricht also eine HQL-Abfrage vielen SQL-Abfragen, die bei Bedarf ausgeführt werden? Wie auch immer, träge oder nicht, wie kann ich einen LINKEN OUTER JOIN? Und nicht in HQL mit der Kriterien-API. Prost! –

34

Wenn Sie nach links müssen auf den Tisch Produkte kommen gerade tun:

..... Create ("Produkte", "Produkt", Criteria.LEFT_JOIN);

+0

wirklich einfach und hilfreich, vielen Dank! – Sllouyssgort

+1

Veraltet jetzt, verwenden Sie Ankits Antwort – jlars62

20

Sdavids Antwort API ist deprecated jetzt. Seine aktualisierte Version ist

.... Create ("Mitarbeiter", "emp", JoinType.LEFT_OUTER_JOIN)

+0

Danke. Es hilft mir, die Verwendung der veralteten API zu eliminieren –