私は何かを理解したと思います。まず、何らかの理由で静的変数にアクセスできないようです。問題を解決するために次のアプローチを使用しました。
- 指定された JoSQL ステートメントを取得するメソッドを作成する
- 「{?FULL_PACKAGE_AND$CONSTANT}」と言って、置き換えたい定数をマークします。
- リフレクションを使用して、フィールドから列と列 (および値) を決定します。
- "{?" 値が使用できなくなるまで繰り返しステートメントを置き換えます。
例:
JoSQL ステートメントは次のようになります。
(isWeapon = TRUE AND getItem.getType2 = {?com.l2jserver.gameserver.model.items.L2Item$TYPE2_WEAPON})
query-object を使用する方法:
final Query query = DataLayer.createJoSqlQuery(joSql);
JoSQL ステートメントの (前) 処理方法:
final Query query = new Query();
int variableColumn = 0;
while (joSql.indexOf("{?") > -1) {
variableColumn++;
final int startIndex = joSql.indexOf("{?");
final int endIndex = joSql.indexOf("}", startIndex);
final String value = joSql.substring(startIndex + 2, endIndex);
try {
final Object variableValue = Class.forName(value.split("\\$")[0]).getField(value.split("\\$")[1]).get(null);
query.setVariable(variableColumn, variableValue);
joSql = joSql.replace("{?" + value + "}", "?");
}
catch (...) {
e.printStackTrace();
}
}
query.parse(joSql);
return query;
JoSQL ステートメントの前処理メソッドは、基本的に、特定の JoSQL ステートメントを繰り返し処理し、文字列 "{?" が含まれているかどうかを確認します。存在する場合は、コピー アンド ペーストを行います (定数名の直前にあるドル記号に注意してください)。
最後に、オブジェクトを作成し、準備済みステートメントの「setObject」メソッドに似たものを使用してそれらを設定します。最後に、JoSQL ステートメント内の値を疑問符 ("?") に置き換え、新しく作成された Query オブジェクトに対応するオブジェクトを設定します。これは、後で情報を取得するために使用されます。