0

我已经使用 JoSQL 好几个月了,今天我遇到了一个我不知道如何解决的问题。我可能可以通过绑定变量/占位符来解决它,但我想在查询中包含这些字段。

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

这是我的查询。TYPE_A 是“myclass”类中的公共静态最终 int 属性。访问方法(例如 getType)很容易,因为 getType 应该是来自 MyObject 的方法——只是我没有在它后面写圆括号(据我所知,这就是 JoSQL 的工作方式)。

有谁碰巧知道如何访问公共静态最终字段?

JoSQL 使用轻轻的 web-utils;它似乎是某种 Accessor/Getter/Setter 框架。我很想在不必绑定变量的情况下访问该属性,但我无法这样做。

提前感谢您的帮助!对此,我真的非常感激。

4

1 回答 1

0

我想我已经想通了。首先:无论出于何种原因,似乎都无法访问静态变量。我使用以下方法来解决我的问题:

  1. 创建一个方法,该方法获取给定的 JoSQL 语句
  2. 通过说“{?FULL_PACKAGE_AND$CONSTANT}”标记要替换的常量
  3. 使用反射来确定字段中的列以及列(和值)
  4. 迭代地替换语句,直到没有“{?”-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 对象中设置相应的对象,该对象稍后用于检索信息。

于 2013-04-01T21:29:01.310 回答