使用JoSQL访问公共静态final字段

时间:2013-03-27 22:10:07

标签: josql

我已经使用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框架。我喜欢在不必绑定变量的情况下访问该属性,但我无法这样做。

提前感谢您的帮助!我真的很感激。

1 个答案:

答案 0 :(得分:0)

我想我已经找到了一些东西。第一:似乎无法以任何理由访问静态变量。我使用以下方法来解决我的问题:

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