作者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/cn.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