Ich habe zu HQL-basierten Motor schreiben, dass Patch HQL-Abfragen on the fly dynamisch hinzufügen Joins und wo Teile (Fragen zu verhindern - ich muss HQL, nicht Kriterien API verwenden).
Z.B. Injektion nach HQL from Object a
etwas wie from Object a JOIN a.path b WHERE b.id='XYZ'
Ich sehe mehrere Möglichkeiten, aber keine davon funktioniert für mich:
-
Java
String.insert()
Ansatz. Suchen Sie die Position der WHERE-Anweisung und fügen Sie Joins vor und andere Teile nach der Anweisung hinzu. Es ist keine triviale Aufgabe für HQL wie dieseSELECT a, (SELECT b FROM Object2 b WHERE b.path=a) FROM Object a WHERE EXISTS(SELECT 1 FROM ... WHERE)
Anhängiger Algorithmus: Ich könnte die Anzahl der Klammern () vor jedem WHERE berechnen und wenn sie Null ist, habe ich die richtige WHERE-Position gefunden. Könnte mir jemand einen einfacheren Algorithmus oder eine einfache Implementierung in Java vorschlagen?
2. ich vermute, dass meine Aufgabe durch reguläre Ausdrücke gelöst werden könnte, aber ich kann keinen korrekten regulären Ausdruck schreiben für String.replace()
3. ich habe die AST/ANTLR-basierte Grammatik gesehen und konnte meine HQL parsen, aber ich sehe keinen Weg, wie sie mir helfen könnte (d.h. ich habe die Anweisung, aber nicht die Position der richtigen Anweisung WHERE
).
Es gibt eigenständige Bibliotheken für SQL-Parsing, aber nicht für HQL.
Wie auch immer, vielen Dank für Ihre Meinung :)