我想我已经想通了。首先:无论出于何种原因,似乎都无法访问静态变量。我使用以下方法来解决我的问题:
- 创建一个方法,该方法获取给定的 JoSQL 语句
- 通过说“{?FULL_PACKAGE_AND$CONSTANT}”标记要替换的常量
- 使用反射来确定字段中的列以及列(和值)
- 迭代地替换语句,直到没有“{?”-values 可用
示例:
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 对象中设置相应的对象,该对象稍后用于检索信息。