2009-05-09 3 views
0

Ich habe ein Abfrageproblem in Hibernate. Ich habe eine Tabelle, "test", mit vorhandenen Daten. Ich habe eine Anforderung, wo ich das Schema der Testtabelle nicht ändern kann, also habe ich eine andere Tabelle erstellt, 'testExtension', deren Primärschlüssel ein Fremdschlüssel für den Primärschlüssel von Test ist. Daten in testExtension ist eine Teilmenge der Daten im Test. h. es wird weniger Zeilen in "testExtension" als in "test" geben.Abfragen von "Erweiterungstabellen" mit Hibernate

Ich habe diese Beziehung in einer Konfigurationsdatei wie folgt definiert:

<class name="Test" table="test"> 
<id name="testId" column="test_id"> 
    <generator class="sequence"> 
     <param name="sequence">test_id_seq</param> 
    </generator> 
</id> 

<property name="name"/> 


<joined-subclass name="TestExtension" table="testExtension"> 
    <key column="test_id"/> 

    <property name="summary" /> 
    <property name="homepage"/> 
</joined-subclass> 

Mit diesem Setup, ich bin in der Lage ein TestExtension Objekt in meinem Java-Programm zu erstellen, es mit Daten zu füllen, Speichern Sie es über Hibernate, und bestätigen Sie die Transaktion. Und es speichert Daten sowohl in Test als auch in TestExtension korrekt.

Mein Problem tritt auf, wenn ich versuche, Daten aus diesen Tabellen abzufragen. Wenn ich jetzt eine bestimmte test_id unter Verwendung der TestExtension.class für QBE abfrage, wird nur eine Zeile zurückgegeben, wenn diese ID sowohl in Test als auch in TestExtension vorhanden ist. Wenn ich die Test.class zu QBE verwende, wird die Zeile zurückgegeben, aber ich habe keinen Zugriff auf die in TestExtension gespeicherten Daten.

Meine Frage ist: Wie kann ich diese Tabellen abfragen, so dass die Ergebnisse auf einem 'linken äußeren Join' von Test und TestExtension basieren? Jede Lösung wird geschätzt, ob es sich um eine Abfrage per Beispiel, HQL oder etwas anderes handelt (vorzugsweise nicht über Raw SQL).

Danke!

+0

Ist es möglich, dass Sie Hibernate-Annotationen verwenden? Ich habe genau das gleiche mit Annotationen gemacht und wenn Sie wollen, kann ich Proben einreichen. –

Antwort

1

HQL ist wahrscheinlich der einfachste Weg, dies zu tun. Docs sind hier:

http://docs.jboss.org/hibernate/stable/core/reference/en/html/queryhql-joins.html

Klingt wie, was Sie vielleicht tun möchten, ist Ihre Beziehungen neu zuordnen, so dass Test-und TestExtension eine Beziehung Eins-zu-eins anstelle von Vererbung. Dann können Sie nach Test und TestExtension suchen, indem Sie einen linken äußeren Join über die Eins-zu-eins-Verbindung verwenden.

+0

Ja, das funktioniert. Am Ende habe ich ein Eins-zu-eins-Mapping gemacht, bei dem TestExtension nur ein anderes Objekt im "Test" POJO ist. Wenn Sie die Beziehung auf diese Weise einrichten, verhält sich QBE so, wie ich es erwartet hatte ... Wenn ich eine Abfrage mit Hilfe der 'Test' Klasse durchführe, fragt sie alle Einträge in der 'test' Tabelle ab und füllt die Test.TestExtension-Objekt, wenn ein zugehöriger Eintrag in meiner Erweiterungstabelle vorhanden ist. – Todd

0

Wenn Sie HQL verwenden, um eine Abfrage für die Klasse Test zu schreiben, sollte es tun, was Sie wollen. Ich nehme an, dass QBE die Klasse Ihrer Beispielentität als einen der Abfrageparameter hinzufügt.

So sth wie:

from Test t where t.property = :value 

sollten entweder Test- oder TestExtension Einheiten zurück. Beachten Sie, dass (zumindest mit den Versionen von Hibernate, die ich verwendet habe). In diesem Fall sollte Hibernate Ihnen die tatsächlichen Entitäten und nicht nur einen Proxy zurückgeben. Beachten Sie, dass TestExtension-Entitäten manchmal als einfache Test-Lazy-Loading-Proxies zurückgegeben werden können.

Verwandte Themen