java - Jooq 按已知数量的参数排序
问题描述
我在我的 Java 应用程序中使用 Jooq。我从 REST 端点获得了一个列列表(基本上可以是 0 ,1 2 ),以通过在它们之间使用 like 来过滤我的数据库。例如,传入请求包含要搜索的字段和值 f1、f2、f3 的数量。每个字段对应于我的实体中的列。基本上sql应该是例如:
SELECT * from e WHERE location=some_location AND (f1=v1 OR f2=v2 o f3=v3)
其中 f1,v1,f2,v2,f3,v3 来自 REST reuest。它可能包含任意数量的搜索条件(zeor、f1、v1 或 f1、v1 和 f1、v1、f2、v2 或全部)我如何编写一般 JOOQ 子句来处理这种情况
解决方案
第一步是要意识到每个 jOOQ 查询都是一个动态 SQL 查询,因此根据一些输入映射动态生成谓词很简单。假设您有以下数据结构来表示您的字段和值:
Map<String, Object> parameters = ...;
然后,您可以将其翻译成这样的谓词:
Condition result =
parameters
.entrySet()
.stream()
.reduce(
DSL.noCondition(),
(condition, entry) -> condition.or(
// Use Table.field() to find columns by name in your generated table
// This will NPE if your field was not found. Might want to handle that...
((Field<Object>) E.field(entry.getKey())).eq(entry.getValue())
),
Condition::or
);
推荐阅读
- python - 编辑 Django formset 数据创建新记录而不是更新
- python - sqlite中时间戳的差异
- javascript - 当值不存在时重试 API 调用
- c - 如何使“cd”命令在我自己的自定义 shell 中工作?
- docker - 将 ssh-agent 传递给 dockerfile 以安装私有存储库模块
- python - Python将核苷酸翻译成氨基酸
- c++ - 我可以以某种方式将套接字从 winsock2.h 传递给 unique_ptr 并为他制作自定义删除器吗?
- amazon-web-services - 如何为存储库输入新的 AWS CodeCommit 凭证?
- c++ - 输出窗口显示抛出的异常
- windows - 如何从脚本更改 Windows 中的代理设置?