微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – jirutka / rsql-parser和QueryDSL

我有Spring框架创建的REST服务后端,现在我需要找到一种方法来处理来自前端的一些请求中的复杂过滤器.

我正在使用QueryDsl(v3.4.2)框架在整个后端进行查询构建.

我认为使用FIQL或Rsql解析器是最好的方法,所以我试图将jirutka/rsql-parser集成到我的后端项目中.

我是新手,也是QueryDsl.

现在我很困惑所以这是我的求助请求:
有人在之前的休息弹簧项目中集成了jirutka / rsql-parser和QueryDsl吗?如何?

Jirutka / rsql-parser文档只说:

Nodes are visitable,so to traverse the parsed AST (and convert it to
sql query maybe),you can implement the provided RsqlVisitor interface
or simplified NoArgRsqlVisitorAdapter.

并且有关于如何执行此操作的以下示例:

Node rootNode = new RsqlParser().parse("name==Rsql;version=ge=2.0");
rootNode.accept(yourShinyVisitor);

看起来很简单吧?

所以我像这样给我的访客打包:

public class RsqlParserVisitor extends NoArgRsqlVisitorAdapter

实现了接口所需的所有方法.

这里我添加两个例子:

@Override
public BooleanExpression visit(AndNode arg0) {
    // Todo Auto-generated method stub

    String methodNameTmp = "AndNode";
    logger.debug(methodNameTmp + ". arg0: " + arg0);
    logger.debug("operator: " + arg0.getoperator().name());
    for (Node node : arg0) {
        logger.debug(methodNameTmpp + ". node: " + node);
    }

    return null; //DO SOMETHING TO CREATE A BooleanExpression;
}

@Override
public BooleanExpression visit(EqualNode arg0) {
    // Todo Auto-generated method stub
    String methodNameTmp = "EqualNode";
    logger.debug(methodNameTmp + ". arg0: " + arg0);

    logger.debug("operator: " + arg0.getoperator());
    for (String arg: arg0.getArguments()) {
        logger.debug(methodNameTmp + ". arg: " + arg);
    }

    return null; //DO SOMETHING TO CREATE A BooleanExpression;
}

现在我被卡住了:

a)为了创建QueryDsl BooleanExpression,我需要知道我正在处理的类,例如:

    QUser qUser = QUser.user;
    BooleanExpression filter = qUser.firstName.eq("Bob");

要么

    PathBuilderirstName").eq("Bob");

b)当我测试我的代码时,它只执行公共的BooleanExpression访问(OrNode arg0)方法,然后什么也没有.它停在那里.

那一刻我做不了多少.无法创建BooleanExpression,因为我需要首先通过一些ComparisonNode方法然后使用“或”或“和”布尔表达式连接它们.对?

如果至少我可以通过所有节点,那么我可以设法找到通过课程的方法,我并不担心.但是不明白如何遍历所有节点,并且无法做到这一点.

任何解决此问题的指针都将非常感激.

最佳答案
一如既往,在提出问题后(我认为)取得了很大进展.

找到了一种遍历所有节点的方法,并找到了一种方法来传递QueryDsl PathBuilder<?>对象的对象.

PathBuilder<?>是QueryDsl创建的所有QSomething类的父类.

现在我再次陷入寻找创建BooleanExpression的方法.

任何帮助将不胜感激.

我现在在我的服务中有以下内容

@Override
public PagesqlFilters) {

    Pageable pageable = new PageRequest(pPage,pSize,pSort);

    BooleanExpression filters = null;

    Node queryTree;
    try {
        logger.debug("Parsing query: {}",pRsqlFilters);
        queryTree = new RsqlParser().parse(pRsqlFilters);

        RsqlParserVisitorsqlParserVisitor = new RsqlParserVisitorsqlParserVisitor,QUser.user);

    } catch (TokenMgrError e) {
        // Todo Auto-generated catch block
        e.printstacktrace();
    } catch (RsqlParserException e) {
        // Todo Auto-generated catch block
        e.printstacktrace();
    }


    Page

这在访客中:

public class RsqlParserVisitorsqlVisitoraram) {
        // Todo Auto-generated method stub

        String nombreTmp = "OrNode";
        printLogicalNode(nombreTmp,node,param);

        return null;
    }

    @Override
    public BooleanExpression visit(EqualNode node,EntityPathBasearam) {
        // Todo Auto-generated method stub

        String nombreTmp = "EqualNode";
        printComparisonNode(nombreTmp,param);

        return null;
    }

...

    public void printLogicalNode(String pNombreNodo,LogicalNode pNode,EntityPathBasearam) {
        logger.debug(pNombreNodo + ". node: " + pNode + ". param: " + pParam);

        logger.debug("operator: " + pNode.getoperator().name());

        for (Node subNode : pNode) {
            logger.debug(pNombreNodo + ". subNode: " + subNode);
            subNode.accept(this,pParam);    <=========== this was the key to be able to traverse every node
        }
    }

    public void printComparisonNode(String pNombreNodo,ComparisonNode pNode,EntityPathBasearam) {
        logger.debug(pNombreNodo + ". node: " + pNode + ". param: " + pParam);

        logger.debug("Selector: " + pNode.getSelector());
        logger.debug("operator: " + pNode.getoperator());

        for (String argTmp : pNode.getArguments()) {
            logger.debug(pNombreNodo + ". argTmp: " + argTmp);
        }

    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐