0

私は JoSQL をかなりの月間使用してきましたが、今日、解決方法がわからない問題に遭遇しました。おそらく変数/プレースホルダーをバインドすることで解決できますが、クエリにフィールドを含めたいと思います。

SELECT * FROM ...MyObject WHERE getType != com.mypackage.myclass.TYPE_A

これは私が持っているクエリです。TYPE_A は、「myclass」クラスの public static final int 属性です。メソッド (getType など) へのアクセスは簡単です。getType は MyObject のメソッドであると想定されるためです。ただし、その後に丸括弧を記述しません (私の知る限り、JoSQL はこのように動作します)。

public static final フィールドにアクセスする方法を知っている人はいますか?

JoSQL は、gentleweb-utils を使用します。ある種のアクセサー/ゲッター/セッター フレームワークのようです。変数をバインドせずにその属性にアクセスしたいのですが、できませんでした。

事前にご協力いただきありがとうございます。ほんとうにありがとう。

4

1 に答える 1

0

私は何かを理解したと思います。まず、何らかの理由で静的変数にアクセスできないようです。問題を解決するために次のアプローチを使用しました。

  1. 指定された JoSQL ステートメントを取得するメソッドを作成する
  2. 「{?FULL_PACKAGE_AND$CONSTANT}」と言って、置き換えたい定数をマークします。
  3. リフレクションを使用して、フィールドから列と列 (および値) を決定します。
  4. "{?" 値が使用できなくなるまで繰り返しステートメントを置き換えます。

例:
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 オブジェクトに対応するオブジェクトを設定します。これは、後で情報を取得するために使用されます。

于 2013-04-01T21:29:01.310 に答える