Pierced
I'm new here

Query: Negation von Statements, SubSelects

Hallo,

wir stehen vor der Aufgabe, aus einer Menge von Kategorien (eine entity in unserem Projekt) eine weitere Sub-Menge auszuschließen.

Wir möchten das ganze durch eine Query lösen und verzweifeln schier, weil es offenbar kein NOT-Constraint zu geben scheint.

Weiterhin ist der Constraint "Sub" bzw. "NotSub" nicht dokumentiert. Auch aus dem Konstruktor ist seine Verwendung nicht ersichtlich.

Wäre es möglich, hier mit einem Beispiel für Abhilfe zu sorgen?...

Was wir erreichen möchten, lässt sich in SQL-Syntax in etwa wie folgt beschreiben:

SELECT * FROM categories c WHERE c.fs_id NOT IN (SELECT fs_id FROM categories c2 WHERE c2.field1 LIKE 'Natur' AND c2.field2 LIKE 'Tiere' AND c2.field3 IS NOT NULL)

Vielen Dank und viele Grüße aus Hamburg

Georg

3 Replies
gelinski
I'm new here

Die Funktionalität steht nun in der aktuellen Version zur Verfügung und wurde positiv getestet.

0 Kudos

Das ist ja prima - gibt es dazu ein paar Zeilen Dokumentation?

Viele Grüße aus Köln

Jan Oltmanns

0 Kudos
kloe
I'm new here

Ich beschreibe einfach mal, wie wir die Subselects einsetzen (jetzt, da sie endlich laufen).

Wir haben eine Story-Tabelle für redaktionelle Beiträge, die über mehrere M-zu-N-Beziehungen zu anderen Tabellen verknüpft sind. Für das Beispiel nehme ich mal die Autoren-Tabelle.

Das Ziel war es, Abfragen zu ermöglichen, bei denen nach Autoren gesucht werden kann, allerdings auch welche, in denen Autoren ausgeschlossen werden. An der Stelle mussten wir erfahren, dass die Not-Equal-Constraint nicht für den Auschluss im Kontext von M-zu-N-Beziehungen funktionieren (im Gegensatz zu 1-zu-N-Beziehungen, wo sie wunderbar funktionieren).

Daher verwenden wir das NotSub-Subselect wie folgt:

/* unsere Abfrage */

Select query = session.createSelect("stories");

/* die Ausschluss-Abfrage mit den auszuschliessenden Autoren

es ist wichtig, dass diese Abfrage auch auf die Stories-Tabelle gesetzt wird, da so die M-zu-N-Mapping-Tabelle umgangen wird (Verursacher der meisten Probleme) */

Select subSelect = session.createSelect("stories");

subSelect.setConstraint(new Equal("authors_list.fs_id", 1234));

/* Einbindung des Subselects, die weiteren Parameter sind die abzugleichenden Werte, in diesem Fall die fs_id's der Haupt-Abfrage mit den fs_id's der Ausschluss-Abfrage (in dieser Reihenfolge) */

NotSub notSub = new NotSub(fs_id, subSelect, fs_id);

query.add(notSub);

Ich hoffe, ich konnte weiterhelfen.

0 Kudos