我想我已經想通一些東西。首先:無論出於何種原因,都無法訪問靜態變量。我用下面的方法來解決我的問題:?
- 創建一個方法,它拿起一個給定的JoSQL語句
- 標記常量,它要替換,通過說「{$ FULL_PACKAGE_AND常數衝」
- 使用反射來確定列以及從外地
- 反覆列(和值)替換聲明,直到沒有‘{’ - 值可用
考試PLE:
JoSQL語句是這樣的:使用查詢對象
(isWeapon = TRUE AND getItem.getType2 = {?com.l2jserver.gameserver.model.items.L2Item$TYPE2_WEAPON})
方法:
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對象中設置相應的對象,該對象稍後用於檢索信息。