2013-03-27 45 views
0

公共靜態最終場我一直在使用JoSQL了好幾個月,今天我碰到我不知道如何解決的一個問題。我可能可以通過綁定變量/佔位符來解決它,但我想在查詢中包含這些字段。現在訪問使用JoSQL

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

這是我的查詢。 TYPE_A是「myclass」類中的一個公共靜態final int屬性。訪問方法(比如getType)很容易,因爲getType有望成爲MyObject的一種方法 - 只是我不會在它之後寫出括號(這是JoSQL的工作原理,據我所知)。

有誰碰巧有一個想法,如何訪問一個公共靜態最終字段?

JoSQL使用gentlyweb-utils的;它似乎是某種Accessor/Getter/Setter框架。我很想訪問該屬性,而不必綁定變量,但我一直無法這樣做。

感謝您的幫助提前!對此,我真的非常感激。

回答

0

我想我已經想通一些東西。首先:無論出於何種原因,都無法訪問靜態變量。我用下面的方法來解決我的問題:?

  1. 創建一個方法,它拿起一個給定的JoSQL語句
  2. 標記常量,它要替換,通過說「{$ FULL_PACKAGE_AND常數衝」
  3. 使用反射來確定列以及從外地
  4. 反覆列(和值)替換聲明,直到沒有‘{’ - 值可用

考試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對象中設置相應的對象,該對象稍後用於檢索信息。