作者lueichun (= =)
看板java
標題[問題] 使用JSQLParser,要將抓出來的where子句
時間Fri Feb 18 18:32:03 2022
※狀況概述:
我現在要利用JSQLParser這個套件,將SQL語句的內容解析出來,例如將SELECT句子內的
Where子句抓出來,然後作其他處理。現在是可以抓出where子句出來,不過當我要用
變數去接該where子句時,例如這樣:
String left = "";
left = expr.getLeftExpression().toString();//=右邊是抓出來的where子句
就會跳出:
Local variable left defined in an enclosing scope must be final or effectively
final jsqlparser
看起來是不能直接用一個單純的變數去接,我google的結果,看起來是跟
內部類別跟local variable的互動有關係,不過我找到的都是lambda或是多執行緒的範例,
而且就算是把left這個變數設成final,也還是會跳出
final變數不能被assgin值的錯誤
程式碼附在下面,請問為什麼要這樣設定?然後該怎麼改才好呢?
※程式碼:
public static void test(String sql) throws JSQLParserException {
String whereClause = "";
String left = "";
if (CCJSqlParserUtil.parse(sql) instanceof Select) {
//取出一般查詢的where子句
Select select = (Select)CCJSqlParserUtil.parse(sql);
System.out.println(select.getSelectBody());
PlainSelect pl = (PlainSelect)select.getSelectBody();
if(pl.getWhere()!=null){
whereClause = pl.getWhere().toString();
}
//這裡有抓到where子句
System.out.println("whereClause=" + whereClause);
}
if(whereClause != null && !whereClause.equals("")) {
//有抓到where子句,所以會進來if區塊內
Expression expr =
CCJSqlParserUtil.parseCondExpression(whereClause);
expr.accept(new ExpressionVisitorAdapter() {
@Override
protected void visitBinaryExpresion(BinaryExpression expr){
if (expr instanceof ComparisonOperator) {
//這裡有印出抓到的WHERE子句,結果正常
System.out.println(
"left=" + expr.getLeftExpression() +
" op=" + expr.getStringExpression() +
" right=" + expr.getRightExpression());
left = expr.getLeftExpression().toString();
//在這行出錯
//跳出Local variable left defined in an enclosing scope
//must be final or effecti final jsqlparser
}//end if
super.visitBinaryExpression(expr);
}
//end protected void......
});//end if
}//end if
}
//end整個method
※錯誤訊息:
※補充說明:
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 49.216.25.202 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/java/M.1645180325.A.04C.html
※ 編輯: lueichun (49.216.25.202 臺灣), 02/18/2022 18:42:59
1F:推 icydream: 把left宣告成字串陣列, 後面的操作改成left[0] 02/19 09:04