首页 > 解决方案 > 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 子句来处理这种情况

标签: javajooq

解决方案


第一步是要意识到每个 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
    );

推荐阅读