gpt4 book ai didi

java - jirutka/rsql-parser 和 QueryDSL

转载 作者:搜寻专家 更新时间:2023-10-30 23:03:05 31 4
gpt4 key购买 nike

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

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

我认为使用 FIQL 或 RSQL 解析器是最好的方法,所以我正在尝试集成 jirutka/rsql-parser到我的后端项目。

我对它和 QueryDsl 都很陌生。

现在我很困惑,所以这是我的帮助请求:
以前有没有人在 rest spring 项目中集成过 jirutka/rsql-parserQueryDsl如何集成?

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<BooleanExpression> {

实现了接口(interface)要求我执行的所有方法。

这里我再举两个例子:

@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");

    PathBuilder<User> user = new PathBuilder<User>(User.class, "user");
BooleanExpression filter = user.getString("firstName").eq("Bob");

b) 当我测试我的代码时,它只执行 public BooleanExpression visit(OrNode arg0) 方法,然后什么都不执行。它就停在那里。

那一刻我无能为力。还不能创建 BooleanExpression,因为我需要先通过一些 ComparisonNode 方法,然后用“or”或“and” boolean 表达式连接它们。对吧?

如果至少我可以通过所有节点,那么我可以设法找到通过类(class)的方法,我不担心。但是不明白如何遍历所有的节点,一直做不到。

任何解决此问题的建议,我们将不胜感激。

最佳答案

一如既往,在提出问题后(我认为)取得了很大的进步。

找到了遍历所有节点的方法,找到了传递QueryDsl的方法PathBuilder<?>向访客提出异议。

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

现在我又陷入了寻找创建 BooleanExpression 的方法的困境。

如有任何帮助,我们将不胜感激。

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

@Override
public Page<User> getUsers(Emisor pEmisor, int pPage, int pSize, Sort pSort, String pRSQLFilters) {

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

BooleanExpression filters = null;

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

RsqlParserVisitor<BooleanExpression, QUser> rsqlParserVisitor = new RsqlParserVisitor<BooleanExpression, QUser>();
filters = queryTree.accept(rsqlParserVisitor, QUser.user);

} catch (TokenMgrError e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RSQLParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


Page<User> lista = userRepository.findAll(filtros, pageable);

return lista;

}

访问者中的这个:

public class RsqlParserVisitor<BooleanExpression, A> implements RSQLVisitor<BooleanExpression, EntityPathBase<?>> {
...
@Override
public BooleanExpression visit(OrNode node, EntityPathBase<?> param) {
// TODO Auto-generated method stub

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

return null;
}

@Override
public BooleanExpression visit(EqualNode node, EntityPathBase<?> param) {
// TODO Auto-generated method stub

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

return null;
}

...

public void printLogicalNode(String pNombreNodo, LogicalNode pNode,
EntityPathBase<?> pParam) {
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,
EntityPathBase<?> pParam) {
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);
}

}

}

关于java - jirutka/rsql-parser 和 QueryDSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26491913/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com