4D v17.4

dataClass.query()

Home

 
4D v17.4
dataClass.query()

dataClass.query()  


 

Die Methode dataClass.query() sucht für alle Entities in der DataClass nach Entities, welche die in queryString und (optional) value angegebenen Suchkriterien erfüllen, und gibt ein neues Objekt vom Typ EntitySelection zurück, das alle gefundenen Entities der DataClass enthält. Lazy loading wird angewendet.

Werden keine passenden Entities gefunden, wird eine leere EntitySelection zurückgegeben.

Der Parameter queryString verwendet folgende Syntax:

attributePath comparator value {logicalOperator attributePath comparator value}

Definitionen:

  • attributePath: Name des Dataclass Attributs, in dem Sie die Suche ausführen wollen, z.B. "country". Das kann jeder gültige Attributspfad sein, z.B. "country.name".
    Bei einem Attributspfad vom Typ Collection verwenden Sie eckige Klammern [] zum Verwalten aller Vorkommen.

    Hinweis: Sie können nicht nach Attributen suchen, die im Namen Sonderzeichen, wie "." oder "[ ]" enthalten, da sie im Such-String nicht korrekt gewertet werden. Weitere Informationen dazu finden Sie im Abschnitt Identifier für Objekteigenschaft. Außerdem dürfen Attributnamen keine Symbole wie "=", ">", "#"... enthalten, da sie als Vergleichssymbole interpretiert werden (siehe nächster Punkt).
  • comparator: Symbol zum Vergleichen von attributePath und value. Es gibt folgende Symbole:
    VergleichSymbol(e)Kommentar
    Ist gleich =, ==Erhält passende Daten, unterstützt den Joker @, berücksichtigt weder Groß- und Kleinschreibung noch diakritische Zeichen.
    ===, ISErhält passende Daten, bewertet @ als Standardzeichen und nicht als Joker, berücksichtigt weder Groß- und Kleinschreibung noch diakritische Zeichen.
    Not equal to#, !=unterstützt den Joker (@)
    !==, IS NOTbewertet @ als Standardzeichen und nicht als Joker
    Kleiner als <
    Größer als >
    Kleiner als oder gleich <=
    Größer als oder gleich >=
    Enthalten inINErhält Daten, die mit mindestens einem Wert in einer Collection bzw. einem Satz Werte übereinstimmt
    Nicht enthalten in einer AnweisungNOTKlammern sind zwingend, wenn NOT vor einer Anweisung mit mehreren Operatoren verwendet wird
    Enthält Schlüsselwort%Schlüsselwörter lassen sich in Attributen vom Typ String oder Bild verwenden
  • value: Wert zum Vergleichen mit dem aktuellen Wert der Eigenschaft jeder Entity in der Entity-Selection oder Element in der Collection. Das kann jeder Ausdruck vom gleichen Datentyp wie die Eigenschaft sein oder ein Platzhalter :paramIndex (siehe unten).
    Werte von Konstanten stehen zwischen einfachen Anführungszeichen. Die Schlüsselwörter true, false sind für Konstanten verboten. Mit dem Schlüsselwort "null" können Sie den Wert Null in einer Suche vergleichen. Diese Suche findet die Eigenschaften null und undefined
    Für eine Suche nach einem String innerhalb eines anderen String (eine Suche "Enthalten in") verwenden Sie den Joker (@) in value, um den zu suchenden String zu isolieren, zum Beispiel: "@Smith@".
    Für numerische Werte dient Punkt als Dezimaltrenner. Datumsangeben müssen im Format "YYYY-MM-DD" sein.
    Bei einer Suche mit einem IN Vergleichsoperator muss value eine Collection sein bzw. Werte, die zum Typ des Attributspfads zwischen eckigen Klammern [] passen, getrennt durch Kommas (bei Strings müssen Anführungszeichen " mit "\" abschließen).
  • logicalOperator: verbindet mehrere Bedingungen in der Suche (optional). Es gibt folgende logische Operatoren (Sie können Name oder Symbol übergeben):
    KonjunktionSymbol(e)
    AND&, &&, and
    OR|, ||, or

Anführungszeichen verwenden
Innerhalb der Suche müssen Sie einfache Anführungszeichen ' ' setzen, doppelte Anführungszeichen " " verwenden Sie zum Umrahmen der gesamten Suche. Andernfalls wird ein Fehler generiert. Zum Beispiel:

"employee.name = 'smith' AND employee.firstname = 'john'"

Hinweis: Einzelne Anführungszeichen, z.B. ein Apostroph, werden in gesuchten Werten nicht unterstützt, da sie den Suchstring unterbrechen. So erzeugt die Suche "comp.name = 'John's pizza' " einen Fehler. Für solche Fälle sollten Sie Platzhalter verwenden (siehe unten).

Klammern verwenden
Mit Klammern in einer Suche können Sie Prioritäten beim Berechnen setzen. Zum Beispiel:

"(employee.age >= 30 OR employee.age <= 65) AND (employee.salary <= 10000 OR employee.status = 'Manager')"

Bei Suchen mit Platzhaltern sind Parameter value erforderlich. Platzhalter sind Tags, die Sie in Suchstrings einfügen und die beim Bewerten durch einen anderen Wert ersetzt werden. Sie können bis zu 128 Parameter value verwenden.

Hinweis: Werte für Platzhalter lassen sich auch als Collection in der Eigenschaft parameters des optionalen Parameters querySettings übergeben (nur Suchen für entitySelection und dataClass). Weitere Informationen dazu finden Sie unten im Abschnitt Parameter querySettings.

In queryString fügen Sie für jeden Platzhalter :paramIndex ein (d.h. "verwende den Parameter paramIndex der Suche als Wert zum Vergleichen") und dann übergeben Sie die angeforderten Werte als Parameter value. Beispiel: Für eine Suche nach Angestellten, die in Chicago wohnen und unter 10 000 verdienen, können Sie schreiben:

"employee.city = :1 & employee.salary < :2"; "Chicago";10000

Der Wert wird einmal am Anfang bewertet; er wird nicht für jedes Element bewertet.

Platzhalter in Suchen werden aus zwei Gründen empfohlen:

  1. Verhindert Einfügen von böswilligem Code: Verwenden Sie direkt von Benutzern gefüllte Variablen im Suchstring, könnte ein Benutzer die Suchbedingungen durch Einfügen zusätzlicher Suchargumente verändern. Nehmen wir beispielsweise folgenden Suchstring:
     $vquery:="status = 'public' & name = "+myname //Benutzer gibt Namen ein
     $result:=$col.query($vquery)

    Diese Suche scheint abgesichert, da nicht-öffentliche Daten gefiltert werden. Gibt der Benutzer jedoch im Bereich myname etwas ein wie OR status='private', wäre der Suchstring beim Interpretieren verändert und könnte private Daten zurückgeben.
    Mit Platzhaltern ist ein Überschreiben der Sicherheitsbedingungen nicht möglich:
     $result:=$col.query("status='public' & name=:1";$myname)

    Gibt der Benutzer hier OR status='private' im Bereich myname ein, wird das im Suchstring nicht interpretiert, sondern nur als Wert übergeben. Die Suche nach einer Person mit Namen "smith OR status='private'" schlägt einfach fehl.

  2. Sie müssen sich nicht um Probleme mit Formatierung oder Zeichen kümmern. Zusätzlich können Sie Variablen oder Ausdrücke in Suchargumenten verwenden.
    Beispiele:
     $result:=$col.query("address.city = :1 & name =:2";$city;$myVar+"@")
     $result2:=$col.query("company.name = :1";"John's Pizzas")

Nach Nullwerten suchen
Beim Suchen nach Nullwerten können Sie keine Syntax mit Platzhaltern verwenden, da die Such-Engine Null als einen unerwarteten Vergleichswert betrachtet. Führen Sie beispielsweise folgende Suche aus:

 $vSingles:=ds.Person.query("spouse = :1";Null// funktioniert NICHT

erhalten Sie nicht das erwartete Ergebnis, da der Nullwert von 4D als ein Fehler gewertet wird, der sich aus der Bewertung des Parameters ergibt (z.B. ein Attribut aus einer anderen Suche). Für derartige Suchen müssen Sie die direkte Suchsyntax verwenden:
 $vSingles:=ds.Person.query("spouse = null") //korrekte Syntax

Hinweis: Dieser Parameter wird nur von den Methoden entitySelection.query() und dataClass.query() unterstützt.

In den Parametern querySettings können Sie ein Objekt mit zusätzlichen Optionen übergeben. Es gibt folgende Eigenschaften:

EigenschaftTypBeschreibung
parametersCollectionWerte zum Vergleichen beim Verwenden von Platzhaltern in queryString (alternativer Weg, um Platzhaltern Werte zu übergeben). Werte, die in Parametern value direkt übergeben wurden, werden an die Platzhalter-Sequenz angehängt.
queryPlanBooleanGibt in der resultierenden Entity Collection direkt vor der Ausführung die ausführliche Beschreibung der Suche zurück oder nicht, z.B. die geplante Suche. Die zurückgegebene Eigenschaft ist ein Objekt mit jeder geplanten Suche und untergeordneten Suchen bei komplexen Suchläufen. Diese Option ist während der Entwicklungsphase einer Anwendung hilfreich und wird in der Regel zusammen mit queryPath verwendet. Standard wenn weggelassen: false
queryPathBooleanGibt in der resultierenden Entity Collection die ausführliche Beschreibung der aktuell durchgeführten Suche zurück oder nicht. Die zurückgegebene Eigenschaft ist ein Objekt mit dem aktuellen Pfad für die Suche (in der Regel identisch mit queryPlan, kann unterschiedlich sein, wenn die Engine die Suche optimiert), sowie Bearbeitungszeit und die Anzahl der gefundenen Datensätze. Diese Option ist während der Entwicklungsphase einer Anwendung hilfreich. Standard wenn weggelassen: false

Über queryPlan und queryPath
Die in queryPlan/queryPath gespeicherten Angaben enthalten den Suchtyp (indiziert und sequentiell) und jede notwendige Untersuche zusammen mit den Verbindungsoperatoren. Suchpfade enthalten auch die Anzahl der gefundenen Entities und die erforderliche Zeit zum Ausführen jedes Suchkriteriums. Das sind nützliche Informationen, die Sie beim Entwickeln Ihrer Anwendung analysieren können. Generally, Die Beschreibung des Suchplans und seines Pfads sind im allgemeinen identisch. Sie können u.U. unterschiedlich sein, da 4D beim Ausführen der Suche dynamische Optimierungen zum Verbessern der Performance einfügen kann. Die 4D Engine kann z.B. dynamisch eine indizierte Suche in eine sequentielle umwandeln, wenn sie diese für schneller hält. Das kann bei geringer Anzahl der gesuchten Entities der Fall sein.

Führen Sie beispielsweise folgende Suche aus:

 $sel:=ds.Employee.query("salary < :1 and employer.name = :2 or employer.revenues > :3";50000;"Lima West Kilo";10000000;New object("queryPath";True;"queryPlan";True))

queryPlan:

{Or:[{And:[{item:[index : Employee.salary ] < 50000},{item:Join on Table : Company  :  Employee.employerID = Company.ID,subquery:[{item:[index : Company.name ] = Lima West Kilo}]}]},{item:Join on Table : Company  :  Employee.employerID = Company.ID,subquery:[{item:[index : Company.revenues ] > 10000000}]}]}

queryPath:

{steps:[{description:OR,time:63,recordsfounds:1388132,steps:[{description:AND,time:32,recordsfounds:131,steps:[{description:[index : Employee.salary ] < 50000,time:16,recordsfounds:728260},{description:Join on Table : Company  :  Employee.employerID = Company.ID,time:0,recordsfounds:131,steps:[{steps:[{description:[index : Company.name ] = Lima West Kilo,time:0,recordsfounds:1}]}]}]},{description:Join on Table : Company  :  Employee.employerID = Company.ID,time:31,recordsfounds:1388132,steps:[{steps:[{description:[index : Company.revenues ] > 10000000,time:0,recordsfounds:933}]}]}]}]}

Verschiedene Beispiele für gültige Suchen.

Standardsuche mit Platzhaltern:

 $entitySelection:=dataClass.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";"D@";"R@";"S@";"K@")

Standardsuche ohne Platzhalter:

 $entitySelection :=dataClass.query("firstName = 'S@'")

Suche mit einer verknüpften dataClass:

 $entitySelection:=dataClass.query("lastName = :1 and manager.lastName = :2";"M@";"S@")

Suche mit queryPlan und queryPath Objekten:

 $entitySelection:=dataClass.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";"D@";"R@";"S@";"K@";New object("queryPlan";True;"queryPath";True))
 
  //Sie können dann diese Eigenschaften in der resultierenden Entity-Selection erhalten
 C_OBJECT($queryPlan;$queryPath)
 $queryPlan:=$entitySelection.queryPlan
 $queryPath:=$entitySelection.queryPath

Suche mit Platzhaltern und Werten in Form einer Collection:

 $params:=New object
 $params.parameters:=New collection("D@";"R@";"S@";"K@")
 $entitySelection:=dataClass.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";$params)

Suche in einer Anweisung NOT:

 $entitySelection:=dataClass.query("not(firstName=Kim)")

Suche mit einem Attributspfad vom Typ Collection:

 $entitySelection:=dataClass.query("additionalInfo.hobbies[].name = horsebackriding")

Suche mit einem Attributspfad vom Typ Object:

 $entitySelection:=ds.Employee.query("extra.eyeColor = :1";"blue")

Suche mit einer Anweisung IN:

 $entitySelection:=dataClass.query("firstName in :1";New collection("Kim";"Dixie"))

Suche mit einer Anweisung NOT (IN):

 $entitySelection:=ds.Employee.query("not (firstName in :1)";New collection("John";"Jane"))

Suche mit einem Datum:

 $entitySelection:=dataClass.query("birthDate > :1";"1970-01-01")



Siehe auch 

collection.query( )
dataClass.all()
dataClass.newSelection()
entitySelection.query()
entitySelection.queryPath
entitySelection.queryPlan

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: ORDA - DataClass

 
SEITENINHALT 
 
GESCHICHTE 

 
ARTIKELVERWENDUNG

4D Programmiersprache ( 4D v17)
4D Programmiersprache ( 4D v17.1)
4D Programmiersprache ( 4D v17.2)
4D Programmiersprache ( 4D v17.3)
4D Programmiersprache ( 4D v17.4)