その場で HQL クエリにパッチを適用し、結合と where パーツを動的に追加する HQL ベースのエンジンを作成する必要があります (質問を防ぐために、基準 API ではなく HQL を使用する必要があります)。
from Object a
たとえば、次のようなHQLに注入しますfrom Object a JOIN a.path b WHERE b.id='XYZ'
いくつかのオプションが表示されますが、どちらも機能しません。
Java
String.insert()
アプローチ。WHERE ステートメントの位置を見つけて、ステートメントの前に結合を追加し、ステートメントの後に他の部分を追加します。このような HQL の簡単な作業ではありませんSELECT a, (SELECT b FROM Object2 b WHERE b.path=a) FROM オブジェクト a WHERE EXISTS(SELECT 1 FROM ... WHERE)
保留中のアルゴリズム: 各 WHERE の前に括弧 () の数を計算でき、それがゼロの場合 - 正しい WHERE 位置が見つかりました。Java でのより単純なアルゴリズムまたは単純な実装を提案してくれる人はいますか?
2.私のタスクは正規表現で解決できると思いますが、正しい正規表現を書くことができませんString.replace()
3. AST/ANTLR ベースの文法を見て、HQL を解析できましたが、それがどのように役立つかわかりません (つまり、ステートメントを取得しましたが、正しいステートメントの位置を取得できませんでしたWHERE
)。
4. スタンドアロン ライブラリは SQL 解析用に存在しますが、HQL 用には存在しません。
とにかく、考えてくれてありがとう:)