Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

...

MethodeBeschreibung
exist

Mit Hilfe der exist-Methode kann eine Subquery in eine äußere Query eingebunden werden. Die Verknüpfung von Query und Subquery findet ausschließlich über (Fremd)schlüssel statt.

Hier ein Beispiel. Ziel der Abfrage ist die Ermittlung einer Liste von Bestellungen, für die Kunden mit vollständigen Zahlungsbedingungen hinterlegt sind:


Codeblock
// Alle Kunden, fuer die Zahlungsbedingungen hinterlegt wurden
Query<Kunde> qryKunden = QueryProvider.create(Kunde.class);
qryKunden.where(Kunde.Zahlungsbedingung.notNull());

// Nun brauchen wir alle Bestellungen dieser Kunden        
Query<Bestellung> queryBestellungen = QueryProvider.create(Bestellung.class);
queryBestellungen.where(Bestellung.Bestellnr.notNull())
                 .exist(qryKunden, Bestellung.KundeKundeId)
                 .orderBy(Bestellung.Bestellnr, true);
List<Bestellung> results = QueryProvider.execute(queryBestellungen);


Soll nicht der PrimaryKey als Referenzfeld der Subquery verwendet werden, sondern ein anderer ForeignKey, muss dieser beim Aufruf der exist()-Methode mit angegeben werden:

Codeblock
Auftrag a = context.getBusinessObject(Auftrag.class);

// Subquery zur Ermittlung der Produktgruppe, die im Auftrag angegeben wurde
Query queryPg = QueryProvider.getById(Produktgruppe.class, a.getProduktgruppeId());

// Hauptabfrage des Bestands aller Produkte, die in der Produktgruppe hinterlegt wurden
Query queryBestand = QueryProvider.create(Bestand.class);
queryBestand.exist(queryPg, Bestand.Produkt, Produktgruppe.ProduktProduktId); // Produktgruppe.ProduktProduktId ist Fremdschlüssel in Produktgruppe

List<Bestand> lstResults = QueryProvider.execute(queryBestand);
              
for (Bestand b : lstResults) {
	// ...
}


Neu (Ab 4.34.0 und 4.33.6: Soll eine echte Subform-Suche ausgeführt werden, d.h. es werden Hauptdatensätze mit einer Subform-Bedingung gesucht, dann gilt folgendes Beispiel:

Codeblock
// Alle Bestellungen, deren Betrag größer als 1000 ist.
Query<Bestellung> queryBestellungen = QueryProvider.create(Bestellung.class);
queryBestellungen.where(Bestellung.Betrag.Gte(1000));

// Nun brauchen wir alle Kunden die mindestens eine dieser Bestellungen haben.        
Query<Kunde> queryKunden = QueryProvider.create(Kunde.class);
queryKunden.exist(queryBestellungen, null, Bestellung.KundeKundeId); // Die Null im zweiten Argument kennzeichnet die Subform-Suche

List<Kunde> results = QueryProvider.execute(queryKunden);


Zu beachten ist, dass die Subquery selbst nicht vom QueryProvider ausgeführt werden muss. Sie wird in ihrer fertigen "Strduktur" der äußeren Query übergeben.

...