CodamAIDocs
Themafertig

Filtern und Sortieren über Beziehungen

Punktnotation wie customer.address.city: wie CDMS dafür verknüpft und warum Objekte ohne Beziehung nicht herausfallen.

Ausprägungen
ein Schrittmehrere SchritteObjekt ohne Beziehung (LEFT JOIN)über eine ListeID der Referenzunbekannter PfadSortieren über Pfad

Worum es geht

Du willst Mitarbeiter finden, deren Firma „Codamic“ heißt. Der Name steht nicht im Mitarbeiter, sondern in der Firma. Dafür schreibst du im key einen Pfad: die Namen der Beziehungen mit Punkten verbunden, am Ende das Feld.

{ "key": "company.companyname", "value": "Cod%", "param": "LIKE" }
flowchart LR
    E["employee"] -->|"company"| C["company"]
    C -->|"companyname"| V["'Codamic AG'"]

Wie CDMS einen Pfad auflöst

key = company.companyname auf employee
  1. 1
    CDMS
    zerlegt den Pfad am Punkt: company, companyname
  2. 2
    CDMS
    company ist eine Beziehung → LEFT JOIN von employee auf company
  3. 3
    CDMS
    companyname ist das Feld am Ende → daran wird verglichen
  4. 4
    CDMS→Datenbank
    … FROM employee e LEFT JOIN company c … WHERE c.companyname LIKE 'Cod%'

Ein Pfad darf beliebig viele Schritte haben, z. B. customer.address.city oder order.customer.company.name. Jeder Schritt ist ein weiterer LEFT JOIN.

Warum Objekte ohne Beziehung nicht herausfallen

Beispieldaten: Daniel und Eva arbeiten bei Codamic, Anna bei Acme, Olaf hat keine Firma.

Suche auf employee
FilterDaniel (Codamic)Eva (Codamic)Anna (Acme)Olaf (ohne Firma)Bedeutung
company.companyname LIKE Cod%jajaneinneinOlaf passt nicht, weil er keinen Firmennamen hat
ODER-Gruppe: company.companyname LIKE Cod% / lastname EQ OhnejajaneinjaOlaf ist dabei, der LEFT JOIN verliert ihn nicht
company ISNULLneinneinneinjaalle ohne Firma

Bei einem normalen (inneren) JOIN wäre Olaf in der zweiten Zeile verloren gegangen, obwohl sein Nachname passt. Deshalb nimmt CDMS für Filter immer LEFT JOIN.

Alle Ausprägungen

Pfade in allen Formen

Wann: Feld eines direkt referenzierten Objekts.

{ "key": "company.companyname", "value": "Codamic AG", "param": "EQ" }

Ergebnis: Mitarbeiter der Firma „Codamic AG“.

Wann: Das Feld liegt zwei oder mehr Beziehungen entfernt.

{ "key": "order.customer.city", "value": "Köln", "param": "EQ" } auf einer Rechnungsposition.

Ergebnis: Ein LEFT JOIN pro Schritt.

Wann: Du kennst die id des referenzierten Objekts.

{ "key": "company.id", "value": "a1…", "param": "EQ" }. Das ist die übliche Form für „alle Mitarbeiter dieser Firma“.

Ergebnis: Vergleich über die ID. Eine ungültige UUID liefert 400.

Wann: Du suchst Firmen, bei denen ein Mitarbeiter passt: { "key": "employees.lastname", "value": "M%", "param": "LIKE" }.

Auch eine Liste lässt sich im Pfad durchlaufen. Die Firma kommt einmal in data, egal wie viele ihrer Mitarbeiter passen. totalCount zählt dabei jeden passenden Mitarbeiter mit: Zwei passende Mitarbeiter derselben Firma ergeben totalCount 2 bei einem Objekt in data.

Ergebnis: Firmen mit mindestens einem passenden Mitarbeiter. Für „enthält diesen einen“ gibt es MEMBEROF, das jede Firma genau einmal zählt.

Wann: Ein Teil des Pfads ist falsch geschrieben, z. B. firma.companyname.

CDMS findet den Schritt nicht und lehnt die Suche ab. Sie läuft gar nicht erst.

Ergebnis: 400 unknown-search-key|firma.companyname.

Sortieren über einen Pfad

Auch in order darfst du Pfade verwenden:

"order": [ { "field": "company.companyname", "order": "ASC" } ]

Ein unbekannter Sortierpfad liefert 400 wrong-order-element-exception. Mehr unter Sortierung.

Fallen

Quellen im Code und in der Wissensdatenbank
  • CDMS/cdms-persistence-database – DatabaseConditionBuilder.buildWhereFilter (Pfadauflösung), DatabaseOrderBuilder
  • Probe gegen cdms-integrationtest (employee, company), 2026-09-21
Suchen