我已经使用JoSQL了好几个月了,今天我遇到了一个我不确定如何解决的问题。我可能可以通过绑定变量/占位符来解决它,但我想在查询中包含这些字段。
SELECT * FROM ... MyObject WHERE getType!= com.mypackage.myclass.TYPE_A
这是我的查询。 TYPE_A是“myclass”类中的public static final int属性。访问方法(例如getType)很简单,因为getType应该是MyObject的一个方法 - 只是我不会在它后写圆括号(就我所知,这就是JoSQL的工作方式)。
有没有人碰巧知道如何访问公共静态最终字段?
JoSQL使用gentleweb-utils;它似乎是某种Accessor / Getter / Setter框架。我喜欢在不必绑定变量的情况下访问该属性,但我无法这样做。
提前感谢您的帮助!我真的很感激。
答案 0 :(得分:0)
我想我已经找到了一些东西。第一:似乎无法以任何理由访问静态变量。我使用以下方法来解决我的问题:
示例:强>
JoSQL语句如下所示:
(isWeapon = TRUE AND getItem.getType2 = {?com.l2jserver.gameserver.model.items.L2Item$TYPE2_WEAPON})
使用查询对象的方法:
final Query query = DataLayer.createJoSqlQuery(joSql);
处理JoSQL语句的方法(pre):
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”-method的东西来设置它们。最后,它只是用问号(“?”)替换JoSQL语句中的值,并在新创建的Query对象中设置相应的对象,稍后用于检索信息。