首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用JSqlParser添加新条件?

如何使用JSqlParser添加新条件?
EN

Stack Overflow用户
提问于 2020-06-22 08:21:04
回答 1查看 661关注 0票数 2

我想向我的sql添加新条件。例如,如果查询是;

代码语言:javascript
复制
SELECT EMP_ID, FIRST_NAME FROM EMPLOYEES;

我可以用这个代码添加新的where原因;

代码语言:javascript
复制
@Override
protected void setLimit(final PlainSelect ps,final long rowLimit) {
    Expression where = ps.getWhere();
    if(where == null) {
         try {
            where = CCJSqlParserUtil.parseCondExpression("ROWNUM < " + (rowLimit+1) );
        } catch (JSQLParserException e) {
            e.printStackTrace();
        }
    }
    ps.setWhere(where);
}

此代码将查询更改为

代码语言:javascript
复制
SELECT EMP_ID, FIRST_NAME FROM EMPLOYEES WHERE ROWNUM < 10;

..。

但问题是,当查询是像;

代码语言:javascript
复制
 SELECT EMP_ID, FIRST_NAME FROM EMPLOYEES WHERE EMP_ID = 10 AND EMP_ID = 10 AND FIRST_NAME = 'Steven'; 

我不能在当前条件中添加新条件。是否有办法将此查询更改为喜欢;

代码语言:javascript
复制
 SELECT EMP_ID, FIRST_NAME FROM EMPLOYEES WHERE EMP_ID = 10 AND EMP_ID = 10 AND FIRST_NAME = 'Steven' AND ROWNUM < 10; 

有办法在JSqlParser中做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-24 13:35:29

因此,这里有两种可能的解决方案(这一次比我之前的评论要多一点: ):

代码语言:javascript
复制
    var sql = "SELECT EMP_ID, FIRST_NAME FROM EMPLOYEES WHERE EMP_ID = 10 AND EMP_ID = 10 AND FIRST_NAME = 'Steven'";
    var select = (Select) CCJSqlParserUtil.parse(sql);
    var plainselect = (PlainSelect) select.getSelectBody();
    
    //1. add another condition by deparsing the old one and integrate it into
    //a new expression, which is parsed and then set into your statement.        
    var where = CCJSqlParserUtil.parseCondExpression(plainselect.getWhere() 
           + " and ROWNUM < 10");
   
    //2. second is building a new AndExpression and sets the left item to the
    //original where condition and adds a new condition as the right item.
    var where2 = new AndExpression(plainselect.getWhere(),
           CCJSqlParserUtil.parseCondExpression("ROWNUM < 10"));
    
    //output both versions. in fact they should and are identical.
    plainselect.setWhere(where);
    System.out.println(select.toString());
    
    plainselect.setWhere(where2);
    System.out.println(select.toString());

此代码两次输出以下内容:

代码语言:javascript
复制
SELECT EMP_ID, FIRST_NAME FROM EMPLOYEES WHERE EMP_ID = 10 AND EMP_ID = 10 AND FIRST_NAME = 'Steven' AND ROWNUM < 10

这是一个Java >=V10代码。但是,只要稍加调整,它也可以使用JDK 8运行。

  1. 这个变体只是将实际where语句转换成一个字符串,然后用它构建您想要的条件。然后使用(CCJSqlParserUtil.parseCondExpression)解析产生的字符串表达式,并将该表达式设置为解析的普通select语句(plainselect.setWhere)

第二个变体使用解析的对象并围绕它构建AndExpression。要添加的表达式也可以使用CCJSqlParserUtil.parseCondExpression进行构造或解析,并添加到构造的AndExpression中。

重要的是要知道,这会构造某种JSqlParser对象树项,而不是将其映射到您的SQL的实际语义。为此,您应该使用括号来确保这一点,再次使用类型1或2。顺便说一句,圆括号是使用 parenthesis 对象构造的。

因此,使用这种技术,您可以对JSqlParsers对象树进行各种更改。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62510210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档