我是第一次使用JSQLPARSER.我有一些动态的SQL文件,我需要从该SQL读取表和列名称.经过大量谷歌搜索后,我尝试使用JSQLPARSER.我试图从文件中读取列名,但由于表达式,我无法读取列名,请问任何人在我出错的地方纠正我的代码.我正在获取CLASSCASTEXCEPTION代码:
public static void main(String[] args) throws JSQLParserException
{
// TODO Auto-generated method stub
String statement="SELECT LOCATION_D.REGION_NAME, LOCATION_D.AREA_NAME, COUNT(DISTINCT INCIDENT_FACT.TICKET_ID) FROM LOCATION_D, INCIDENT_FACT WHERE ( LOCATION_D.LOCATION_SK=INCIDENT_FACT.LOCATION_SK ) GROUP BY LOCATION_D.REGION_NAME, LOCATION_D.AREA_NAME";
CCJSqlParserManager parserManager = new CCJSqlParserManager();
Select select=(Select) parserManager.parse(new StringReader(statement));
PlainSelect plain=(PlainSelect)select.getSelectBody();
List selectitems=plain.getSelectItems();
System.out.println(selectitems.size());
for(int i=0;i<selectitems.size();i++)
{
Expression expression=((SelectExpressionItem) selectitems.get(i)).getExpression();
System.out.println("Expression:-"+expression);
Column col=(Column)expression;
System.out.println(col.getTable()+","+col.getColumnName());
}
}
Run Code Online (Sandbox Code Playgroud) 我刚刚开始探索JSqlparser.根据我的理解,我已经修改了TablesNamesFinder以提取列和表,并且它的工作正常但是一个非常小的问题.
@Override
public void visit(Column col) {
Column c = col;
String cname = c.getFullyQualifiedName();
Table t = c.getTable();
System.out.println(t.getName());
}
Run Code Online (Sandbox Code Playgroud)
这个不打印的表,对于大多数情况它打印为null,并且在极少数情况下它打印表的别名但不打印表.有什么我忘记的吗?
其余的访问
@Override
public void visit(SelectExpressionItem exp){
exp.getExpression().accept(this);
}
@Override
public void visit(Table tableName) {
// System.out.println(tableName.getFullyQualifiedName());
}
@Override
public void visit(Select select) {
select.getSelectBody().accept(this);
}
Run Code Online (Sandbox Code Playgroud) 我想使用 JSqlParser 完整、简洁地解析 SQL where 子句。很容易将其解析为单独的条件语句,如下所示
String whereClause = "a=3 AND b=4 AND c=5";
Expression expr = CCJSqlParserUtil.parseCondExpression(whereClause);
expr.accept(new ExpressionVisitorAdapter() {
@Override
public void visit(AndExpression expr) {
if (expr.getLeftExpression() instanceof AndExpression) {
expr.getLeftExpression().accept(this);
} else if ((expr.getLeftExpression() instanceof EqualsTo)){
System.out.println(expr.getLeftExpression());
}
System.out.println(expr.getRightExpression());
}
});
Run Code Online (Sandbox Code Playgroud)
这将产生输出:
a=3
b=4
c=5
Run Code Online (Sandbox Code Playgroud)
我想要的是获取每个单独表达式的左侧、运算符和右侧,以便我可以将值放入一些现有的过滤器对象中。
我知道您可以覆盖每种类型的运算符的访问函数,如下所示:
expr.accept(new ExpressionVisitorAdapter() {
@Override
public void visit(AndExpression expr) {
if (expr.getLeftExpression() instanceof AndExpression) {
expr.getLeftExpression().accept(this);
} else if ((expr.getLeftExpression() instanceof EqualsTo)){
expr.getLeftExpression().accept(this);
System.out.println(expr.getLeftExpression());
}
expr.getRightExpression().accept(this);
System.out.println(expr.getRightExpression());
}
@Override
public void …Run Code Online (Sandbox Code Playgroud) 我正在寻找 Java 中的开源 API 来解析 SQL/HQL 查询,以便它为我提供其中使用的列名和表名。我尝试使用 JSQLParser,它为我提供了查询中使用的表名。但我没有看到支持获取查询中使用的列名。有没有其他 API 可以帮助我解决这个问题?我知道通用 SQL 解析器,但它似乎是付费的。
这是使用 JSQLParser 的代码片段,它为我提供了查询中的表名:
Statement statement;
try
{
statement = CCJSqlParserUtil.parse( " SELECT * FROM ( ( SELECT TBL.ID AS rRowId, TBL.NAME AS name, TBL.DESCRIPTION as description, TBL.TYPE AS type, TBL1.SHORT_NAME AS shortName FROM ROLE_TBL TBL WHERE ( TBL.TYPE = 'CORE' OR TBL1.SHORT_NAME = 'TNG' AND TBL.IS_DELETED <> 1 ) ) MINUS ( SELECT TBL.ID AS rRowId, TBL.NAME AS name, TBL.DESCRIPTION as description, TBL.TYPE AS type, TBL3.SHORT_NAME AS shortName,TBL3.NAME …Run Code Online (Sandbox Code Playgroud) 如何使用JSQLParser区分函数调用和字段名称?
例如,查询SELECT COUNT(*) FROM db.table解析COUNT(*)为字段名称而不是函数调用.
如何更改SQL解析以显示COUNT(*)为函数调用,我需要做什么?
谢谢,
马克斯