java - 如何使用 JSqlParser 添加新条件?

标签 java jsqlparser

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

SELECT EMP_ID, FIRST_NAME FROM EMPLOYEES;
我可以用这个代码添加新的 where 原因;
@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);
}
此代码将查询更改为
SELECT EMP_ID, FIRST_NAME FROM EMPLOYEES WHERE ROWNUM < 10;
...
但问题是当查询是这样的;
 SELECT EMP_ID, FIRST_NAME FROM EMPLOYEES WHERE EMP_ID = 10 AND EMP_ID = 10 AND FIRST_NAME = 'Steven'; 
我无法向当前条件添加新条件。有没有办法将此查询更改为喜欢;
 SELECT EMP_ID, FIRST_NAME FROM EMPLOYEES WHERE EMP_ID = 10 AND EMP_ID = 10 AND FIRST_NAME = 'Steven' AND ROWNUM < 10; 
有没有办法用 JSqlParser 做到这一点?

最佳答案

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

    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());
此代码输出以下两次:
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 运行。
  • 这个变体只是将实际的 where 语句转换为一个字符串,然后用它构建你想要的条件。然后使用 JSqlParser ( CCJSqlParserUtil.parseCondExpression ) 解析生成的字符串表达式,并将生成的表达式设置为解析后的纯选择语句 ( plainselect.setWhere )
  • 第二个变体使用解析的对象并构建一个 AndExpression 周围。要添加的表达式也使用 构造或解析CCJSqlParserUtil.parseCondExpression 再次添加到构建的 AndExpression 以及。

  • 重要的是要知道,这构造了某种 JSqlParser 对象树项,并且不会一对一地映射到 SQL 的实际语义。为此,您应该使用括号来确保这一点,再次使用类型 1 或 2。顺便说一下,括号是使用 构造的。括号目的。
    因此,使用此技术您可以对 进行各种更改。 JSqlParsers 对象树。

    关于java - 如何使用 JSqlParser 添加新条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62510210/

    相关文章:

    java - 列出已解析的 SQL SELECT 语句的所有表/列

    java - JSQLParser 凝胶查询和子查询中的所有选择项

    java - 在 Java 应用程序中查看样式文本(例如 HTML)的最简单方法是什么?

    java - 帮助理解 java 'for' 循环

    java - 展开所有实例的抽象 Java 类

    java - 使用 JSqlParser 完全解析 where 子句

    java - 无论 CRUD 操作如何,从字符串查询中获取表名

    java - 如何从arrayList中删除元素

    java - 从网络驱动器打开文件

    postgresql - JSQL Parser - 关于解析函数的信息