- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有 Spring 框架创建的 REST 服务后端,现在我需要找到一种方法来处理来自前端的某些请求中的复杂过滤器。
我正在使用 QueryDsl (v3.4.2) 框架在整个后端进行查询构建。
我认为使用 FIQL 或 RSQL 解析器是最好的方法,所以我正在尝试集成 jirutka/rsql-parser到我的后端项目。
我对它和 QueryDsl 都很陌生。
现在我很困惑,所以这是我的帮助请求:
以前有没有人在 rest spring 项目中集成过 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<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/
我想解析一些文本,其中某些字段在大多数情况下都具有结构,但偶尔(由于特殊大小写、拼写错误等)该结构会丢失。 例如常规情况是 Cost: 5,但偶尔会显示 Cost: 5m 或 Cost: 3 + 1
以下有什么区别: parser.setFeature("http://xml.org/sax/features/validation",true); and parser.setFeature("ht
我尝试在 Windows 8.1 上的 Git Bash 客户端中执行 npm install,但收到以下错误: npm WARN optional SKIPPING OPTIONAL DEPENDE
试图理解 evancz/url-parser 模块时,我偶然发现了这种我难以理解的类型声明:( source ) type Parser a b = Parser (State a -> List
我长期使用下面的 TypeScript 和 Vue 预设。它有效,但我还没有理解每个选项,现在要理解它。第一:parser之间有什么区别?和 @typescript-eslint/parser ? p
我正在尝试使用node-sql-parser在nodejs中解析sql查询。 const {Parser} = require('node-sql-parser'); const parser = n
自定义指令中的 ngModelCtrl.$parsers.unshift 和 ngModelCtrl.$parsers.push 之间的确切区别是什么。 当发生对模型生效但对表单本身无效的事情时,我想
我正在寻找 SAX 和 Pull Parser 之间的主要区别。我知道 SAX 解析器非常适合处理大型 XML 文件,因为它不存储 XML 并且只在一个方向上遍历。与 DOM 相比。但我无法找到 SA
我已经按照存档中的说明成功(?)安装了 QJson 库。但是编译器给我这个错误: Undefined reference to QJSon::Parser::Parser(). 我找到了安装库文件的位
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
尝试实现 Cucumber 来进行一些自动化测试。当我使用 junit 运行测试时,出现以下错误 项目路径: src/test/java/ cucumberJava -cucumberjava,ja
我已经阅读了我能找到的所有文档,但是我找不到关于这两个中间件的作用的简单解释。 body-parser 中的body 指的是什么?为什么需要解析正文? Cookie 也类似。我是否更正了 cookie
我在gradle项目中使用Xerces jar,然后在gradle插件中使用该项目的jar:实际上,我正在开发一个gradle插件,其中包含使用gradle项目jar的某些功能的自定义任务;当我尝试运
我正在尝试连接到 Linux 上的 FTP 服务器,当我执行 ftp.listFiles(remote); 时遇到异常 SYST 215 Linux Exception in thread "AW
我有react-app的示例安装,我得到了以下内容 Error: Failed to load parser '@typescript-eslint/parser' declared in '.esl
我在 there 中提到过类似的问题.我正在使用 mvn clean compile site 命令,我的版本是: cobertura.version: 2.5.1 findbugs.version:
我正在 Eclipse 中开发 GWT 应用程序并使用 jdom2 读取一些自定义 xml 属性文件。 在最近的更新之后,我的应用程序现在在尝试读取 xml 文件时失败并出现上述错误。相关堆栈跟踪是:
我正在使用 spring+maven。我正在 tomcat 服务器中部署我的应用程序。当我尝试运行我的应用程序时,突然出现以下错误。 INFO: Starting Servlet Engine: Ap
我在玩dateutil module在 Python 2.7.3 中。我只是想使用: import dateutil dateutil.parser.parse("01-02-2013") 但我得到了
一.入参解析库 argparse 有时候写Python脚本,需要处理入参[-h][-v][-F]...等情况,如果自己来解析的话,会花费很多时间,而且也容易出问题,好在Python有现成的li
我是一名优秀的程序员,十分优秀!