Hibernate (schwieriges?) Query

splitshade

Mitglied
Hi,

ich habe diese Frage schon in anderen Foren gestellt, leider konnte mir bisher niemand helfen.
Ich krieg das einfach nicht hin,
ich habe eine Tabelle die verschiedene Versionen von Datensätzen enthält, ähnlich dem Prinzip eines Versionskontrollsystems, das sieht ungefähr so aus:

Objekt1_id Objekt1_Version_1 Objekt1_andere Daten
Objekt2_id Objekt2_Version_1 Objekt2_andere Daten
Objekt3_id Objekt3_Version_1 Objekt3_andere Daten
Objekt1_id Objekt1_Version_2 Objekt1_andere Daten
Objekt2_id Objekt2_Version_2 Objekt2_andere Daten
Objekt1_id Objekt1_Version_3 Objekt1_andere Daten

Innerhalb einer Abfrage möchte ich nun einfach von jedem Objekttyp
die höchste Version bekommen, also ein Select ...
->
Objekt1_id Objekt1_Version_3 Objekt1_andere Daten
Objekt2_id Objekt2_Version_2 Objekt2_andere Daten
Objekt3_id Objekt3_Version_1 Objekt3_andere Daten

Ich hätte gerne eine Lösung mit Hilfe der Hibernate-Criteria API.
Leider finde ich nicht mal den Ansatz.

Ich denke mal, es sollte irgendwie mit Projections gehen, aber ich kriegs wie gesagt nicht hin.

Bin für jede Hilfe sehr dankbar.
 
Hi,

na aber sicher!

die tabelle sieht im Prinzip so aus:
------------------------------------------------------------------------------------------------
ID Aktuelle_Revision beliebige Attribute (unwichtig)
------------------------------------------------------------------------------------------------
- Objekt1_id - Objekt1_revision_1 - irgendwelche anderen attribute
- Objekt2_id - Objekt2_revision_1 - irgendwelche anderen attribute
- Objekt3_id - Objekt3_revision_1 - irgendwelche anderen attribute
- Objekt1_id - Objekt1_revision_2 - irgendwelche anderen attribute
- Objekt2_id - Objekt2_revision_2 - irgendwelche anderen attribute
- Objekt1_id - Objekt1_revision_3 - irgendwelche anderen attribute

Jedes Mal wenn ich ein Objekt speicher wird die aktuelle Revision hochgezählt, man sieht hier also, dass Objekt_1 bereits 3x geändert worden sein muss, da es mittlerweile in Revision 3 gespeichert ist.
PrimaryKey ist hierbei die Objekt_ID zusammen mit der aktuellen Revision_Nummer.

Was ich jetzt will ist im Prinzip eine Anzeige aller aktuellen Objekte in der Datenbank, aber hierbei natürlich nur die aktuellen Revisions, also bei Objekt_1 die 3. Revision, bei Objekt_2 die 2. Revision und bei Objekt_3 die 1. Revision.

Klar geworden?

Gruß

Martin
 
hmmm ist vermuttlich ne doofe Frage, aber kannst du nicht einfach 2 order by Klauseln machen (order by object, revision) und dann immer den oberste Eintrag nehmen?
 
Naja, wie willst du das in einer Query machen?
Da diese Methode sehr häufig aufgerufen wird und extrem viele Datensätze in der Datenbank liegen ist hier ein zeitkritischer Faktor. Ich möchte also um jeden Preis vermeiden dass mehr als eine Query an die Datenbank abgesetzt wird.

Gruß

Martin
 
Ich bin kein SQL Guru und kann dir jetzt nicht das ideale SQL Statement hinwerfen, allerdings sehe zwei bedenkenswerte Punkte:

* Versionsverwaltung in Datenbanken ist immer etwas, was nicht grad nach Performance schreit. Mit steigender Zahl der Einträge wird das ganze auch mit dem cleversten SQL Statement sicher n Bottleneck. Aber kann ja sein, dass das halt die Anforderung ist. Dann kann man an der Schraube sicher nicht mehr drehen

* Wenn Performance wirklich ein Kriterium ist, schießt man auf so komplexe Abfragen nicht unbedingt mit Hibernate. Plain SQL mit nem vernünftigen RowMapper sollte hier deutliche Performancevorteile bieten. Selbst wenn du das theoretisch sinnvollste SQL Statement überhaupt in HQL abgebildet bekommst, ist der Overhead von Hibernate (dirtychecking, reflection, mapping) wahrscheinlich ein Killer. Wärs denn möglich, kontrolliert an Hibernate vorbei zu arbeiten?

Vielleicht gehts mit nem Subselect? Selfjoin? GroupBy? Das sind so Sachen, die mit spontan einfallen - aber wie gesagt, bin kein wirklicher SQL Kenner. Vielleicht hat ja der Joe Celko (wie schreibt man den?) für sowas ne Antwort. Ist ein ziemlicher SQL Guru... google mal nach dem.

Gruß
Ollie
 
OK, ich muss wohl einsehen, dass das nicht so einfach geht.
Andere Frage, ich hätte auch die Möglichkeit, die versionierten Objekte in eine andere Tabelle zu speichern. Allerdings kann ich das Objektmodell nicht ändern. Gibt es denn eine Möglichkeit, eine bestimmte Klasse in verschiedene Tabellen zu speichern?

also in der Art
Code:
if(dirty){
 saveInRevisionedTable()
}else{
 saveInUnRevisionedTable()
}
 
ich kenne zwar hibernate nich wirklich aber ein sql statement mit 2 order by funktioniert wunderbar "select * from products order by plz, name" sortiert zuerst nach plz und innerhalb der gleichen plz's nach name.
 
Zurück