Hibernate: many-to-one - Verwaiste Datensätze löschen

Grizzly

Top Contributor
Hallo alle zusammen,

ich sitze gerade an einem interessanten Problem:
Ich habe zwei Tabellen: file und file_fingerprint (bzw. zwei Klasse FileEntry und FileFingerprint). Nun kann sich der Fingerabdruck einer Datei ändern und die Datei selber gelöscht werden. Nun kann ich aber nicht gleich den Fingerabdruck löschen, da ja auch noch andere Dateien auf ihn verweisen könne. Bzw. während des Scanvorgangs von Dateien kann es ja auch sein, dass eine andere Datei diesen besitzt (bspw. beim Verschieben einer Datei). Sprich ich muss am Ende eines Scanvorgangs die verwaisten Fingerabdrücke löschen. In reinem SQL hätte ich mit
Code:
SELECT ff.id FROM file_fingerprint ff
LEFT OUTER JOIN file f ON (f.fingerprint = ff.id)
WHERE (f.id IS NULL);
mir eine Liste der Fingerabdrücke von der Datenbank geben lassen und diese dann gelöscht. Nach viel rumprobieren ist das einzige, was bei mir in Hibernate funktioniert hat, folgende Abfrage gewesen:
Code:
FROM FileFingerprint AS fp
WHERE (NOT EXISTS(FROM FileEntry AS fe WHERE (fe.fingerprint = fp)))
Nun wäre meine Frage, ob es dafür etwas schöneres als die Lösung mit dem Subselect gibt. Irgendwas in der Form:
Code:
FROM mcp.database.FileFingerprint AS fp
LEFT OUTER JOIN FileEntry AS fe WHERE (fe.id IS NULL)
Das funktioniert natürlich nicht und Hibernate gibt zu recht den Fehler
Code:
[error] Path expected for join!
aus. Würde ich jedoch den Pfad angeben, würde ich die Tabelle file_fingerprint zweimal referenzieren, was nicht Sinn der Sache ist.
 
Hallo Sebastian,

sodele, jetzt habe ich mal wieder Zeit für das Problem. 🙂
Du meinst etwas in der Art?
Code:
FROM FileEntry AS fe
LEFT OUTER JOIN fe.fingerprint AS fp
WHERE (fe IS NULL)
Leider funktioniert das nicht, da in dem Fall der OUTER JOIN ja so funktioniert, dass er mir erst einmal alle FileEntry Objekte gibt. Und im Gegensatz zum INNER JOIN gibt er mir auch die FileEntry Objekte, deren fingerprint Eigenschaft null ist. Mal ganz davon abgesehen, dass mir so eine Abfrage nur FileEntry Objekte zurückgeben würde und keine FileFingerprint Objekte.

Mit einem RIGHT OUTER JOIN müsste es eigentlich gehen. ABER hier habe ich wieder das Problem mit der Rückgabe. Würden mir dann nicht alle FileEntry Objekte zurückgegeben, bei den das FileFingerprint Objekt keinem FileEntry Objekt zugewiesen ist? Dann müsste nach Adam Riese das immer kein Objekt sein. Oder lauter null Werte.
 

Zurück
Oben