30 12
发新话题
打印

用jsqlparser过滤数据集,使用sql 查询的语法

关于jsqlparser的问题

admin大哥,加我QQ 1342104056
问关于jsqlparser的问题。
急急急。
谢谢,恳求你同意。

TOP

感谢这位朋友的信任,不过,有问题,还是在这里提,一则,加qq不方便,二则,便于其他朋友共同学习,sorry

TOP

admin大哥,现在的问题是有个sql语句 select * from table where a=1 and b=2
我有个值传过来a=3,我不让其通过,就像你例子里的eval函数,可你的BinaryOperator.eval,我没找到这个类啊。
我该如何验证传过来的变量是否符合where条件。

具体情形是jms activemq在接收消息时,有个消息选择,具体请看j2ee api 的jms规范里的Session接口的createConsumer方法
MessageConsumer createConsumer(Destination destination,
                               String messageSelector)
                               throws JMSException

messageSelector就是按照sql语法来过滤message的,我不知道他是如何实现的,

他只在接收的时候验证哪些消息可以接收 我现在想在发送的时候也验证下,可activemq没有实现。我自己又不知道他是如何过滤掉不符合条件的消息的。

看了你的例子,通过eval实现了这个过滤功能,但还是不太懂,之所以要加QQ,只是练习方便,这个是比较着急的问题,所以加QQ联系方便,谢谢。

TOP

BinaryOperator.java 可以从简表源码中得到,其作用是封装了 beanshell,beanshell是一个开源的脚本引擎,可以识别java语法,进行条件判断等运算。
使用方法是:
1. 将简表里的 bsh2.0.jar,拿出来,置于你的类路径中。
2. 将 源码中的 BinaryOperator.java 复制出来,放到你的项目源码中,即可.

源码可以从 http://www.jatools.com/jor下载


[ 本帖最后由 jennifer 于 2011-6-15 11:19 编辑 ]

TOP

我按照你说的做了,已经可以打印出结果了,通过或不通过,可是我在测试where条件有and or 时候抛异常了
bsh.InterpreterError: unimplemented binary operator
        at bsh.Primitive.booleanBinaryOperation(Unknown Source)
        at bsh.Primitive.binaryOperationImpl(Unknown Source)
        at bsh.Primitive.binaryOperation(Unknown Source)
        at sqlparser.BinaryOperation._eval(BinaryOperation.java:40)
        at sqlparser.BinaryOperation.eval(BinaryOperation.java:28)
        at sqlparser.WhereExpressionVisitor.visit(WhereExpressionVisitor.java:270)
        at net.sf.jsqlparser.expression.operators.conditional.AndExpression.accept(AndExpression.java:36)
        at sqlparser.WhereExpressionVisitor.eval(WhereExpressionVisitor.java:70)
        at sqlparser.TestSQL2.main(TestSQL2.java:36)

其中TestSQL2.java是我自己写的测试类。请问是什么问题?为什么不支持and或or呢,即复杂的sql

TOP

单个条件测试是没有问题,假如在where条件里多个条件的话,该如何解决呢,我搞了下 还是不行,望指点。
a=1 and b=2 等等类似的条件

跪求。。。

TOP

我用这个代码测了一下,and表达式可以支持,完整代码见附件。
复制内容到剪贴板
代码:

    public static void main(String[] args) {
        try {
            // 准备数据集
            Object[][] data = {
                    { "崔永远", 18 },
                    { "王小鸭", 16 }
                };
            jatools.dataset.Column[] columns = new jatools.dataset.Column[2];
            columns[0] = new jatools.dataset.Column("姓名", String.class);
            columns[1] = new jatools.dataset.Column("年龄", Integer.class);
            RowMeta rowMeta = new RowMeta(columns);
            Statement stat = new CCJSqlParserManager().parse(new StringReader(
                        "select * from a where 姓名='崔永远' and 年龄=18"));
            Select select = (Select) stat;
            Expression where = ((PlainSelect) select.getSelectBody()).getWhere();
            Map<String, Integer> _columns = new HashMap<String, Integer>();
            for (int i = 0; i < rowMeta.getColumnCount(); i++) {
             _columns.put(rowMeta.getColumnName(i).toUpperCase(), i);
            }
            
            WhereExpressionVisitor visitor = new WhereExpressionVisitor(_columns, where);
            for (int i = 0; i < data.length; i++) {
                Object result = visitor.eval(data[i]);
                if (result instanceof Boolean && ((Boolean) result).booleanValue()) {
                    System.out.print("通过=====>");
                } else {
                    System.out.print("不通过=====>");
                }
                System.out.println(StringUtils.join(data[i], ","));
            }
        } catch (JSQLParserException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
附件: 您所在的用户组无法下载或查看附件

TOP

谢谢,版主大哥,我的问题已经解决了,非常非常感谢。
非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢非常感谢

打了这么多字 有点刷屏的感觉 但确实是真心表达我的谢意。呵呵。

TOP

中文的sql语句解析出异常

我用带sql语句解析是出现异常  这是源码
              Statement statement =pm.parse(new StringReader("select * from a where 姓名='崔永远'"));
                if (statement instanceof Select) {
                        Select selectStatement = (Select) statement;
                        PlainSelect ps= (PlainSelect)selectStatement.getSelectBody();
                        System.out.println(selectStatement.getSelectBody());
                        System.out.println(ps.getWhere().toString());
                        System.out.println(((GreaterThan) ps.getWhere()).getRightExpression());
                        System.out.println(((GreaterThan) ps.getWhere()).getStringExpression());
                        SqlParsersUtil sqlParsersUtil = new SqlParsersUtil();
                        List tableList = sqlParsersUtil.getTableNames(selectStatement);
                        for (Iterator iter = tableList.iterator(); iter.hasNext();) {
                                System.out.println(iter.next().toString());
                        }
                }


下面是异常信息
Exception in thread "main" net.sf.jsqlparser.parser.ParseException: Encountered "<EOF>" at line 0, column 0.
Was expecting one of:
    "DROP" ...
    "WITH" ...
    "DELETE" ...
    "CREATE" ...
    "SELECT" ...
    "INSERT" ...
    "UPDATE" ...
    "REPLACE" ...
    "TRUNCATE" ...
    "(" ...
   
        at net.sf.jsqlparser.parser.CCJSqlParser.generateParseException(CCJSqlParser.java:5530)
        at net.sf.jsqlparser.parser.CCJSqlParser.jj_consume_token(CCJSqlParser.java:5406)
        at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:138)
        at com.ytec.bi.ride.analytics.util.SqlParsersUtil.main(SqlParsersUtil.java:172)

TOP

中文不能解析,请参照这里:
http://bbs.jatools.com/viewthread.php?tid=561&extra=page%3D1

TOP

这样的语句怎么会出现问题

update tb_tt set grpcustno='22',changenum='33' where (orgcode,grpcustno) in (select orgcode,grpcustno from tb_tt where changenum='12');


net.sf.jsqlparser.JSQLParserException
at net.sf.jsqlparser.parser.CCJSqlParserManager.parse(CCJSqlParserManager.java:40)
at com.testsql.TestSql1.main(TestSql1.java:60)
Caused by: net.sf.jsqlparser.parser.ParseException: Encountered " <S_IDENTIFIER> "orgcode "" at line 1, column 55.
Was expecting one of:
    "(" ...
    "(" ...
    "(" ...
    "(" ...
    "(" ...
    "(" ...
    "(" ...
    "(" ...
   
at net.sf.jsqlparser.parser.CCJSqlParser.generateParseException(CCJSqlParser.java:5530)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_consume_token(CCJSqlParser.java:5406)
at net.sf.jsqlparser.parser.CCJSqlParser.Expression(CCJSqlParser.java:1493)
at net.sf.jsqlparser.parser.CCJSqlParser.Expression(CCJSqlParser.java:1487)
at net.sf.jsqlparser.parser.CCJSqlParser.WhereClause(CCJSqlParser.java:1257)
at net.sf.jsqlparser.parser.CCJSqlParser.Update(CCJSqlParser.java:187)
at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:116)
at net.sf.jsqlparser.parser.CCJSqlParserManager.parse(CCJSqlParserManager.java:38)
... 1 more
Caused by:
net.sf.jsqlparser.parser.ParseException: Encountered " <S_IDENTIFIER> "orgcode "" at line 1, column 55.
Was expecting one of:
    "(" ...
    "(" ...
    "(" ...
    "(" ...
    "(" ...
    "(" ...
    "(" ...
    "(" ...
   
at net.sf.jsqlparser.parser.CCJSqlParser.generateParseException(CCJSqlParser.java:5530)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_consume_token(CCJSqlParser.java:5406)
at net.sf.jsqlparser.parser.CCJSqlParser.Expression(CCJSqlParser.java:1493)
at net.sf.jsqlparser.parser.CCJSqlParser.Expression(CCJSqlParser.java:1487)
at net.sf.jsqlparser.parser.CCJSqlParser.WhereClause(CCJSqlParser.java:1257)
at net.sf.jsqlparser.parser.CCJSqlParser.Update(CCJSqlParser.java:187)
at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:116)
at net.sf.jsqlparser.parser.CCJSqlParserManager.parse(CCJSqlParserManager.java:38)
at com.testsql.TestSql1.main(TestSql1.java:60)
异常信息====================:null

[ 本帖最后由 ritchie511 于 2012-7-12 23:34 编辑 ]

TOP

(orgcode,grpcustno) in ...不能这么用吧? 只能用一个字段吧。

TOP

真正杰出的好贴

研究JSqlParser好几天了,网上资料不是很多,而且大多都是英文资料,看着很晕。
下载了文件不知道如何解析对象,获得内容,看了此贴豁然开朗。感谢!
另外请教个问题,此应用程序可以在MyEclipse上运行吗?网上说的相关驱动都是适用于Eclipse的。

TOP

可以在myeclipse上运行的,放心.

TOP

jsqlparser架包提供的方法是否能获取sql select语句关键字,求代码,求帮忙

jsqlparser 比如一个select 语句获取其中使用的函数、获取or的个数 获取and的个数 求大神指导 很急

TOP

 30 12
发新话题