Java 已知参数数的Jooq order by

Java 已知参数数的Jooq order by,java,jooq,Java,Jooq,我在Java应用程序中使用Jooq。 我从REST端点得到一个列列表(可以是零,基本上是12) 通过使用like和or来筛选我的数据库。 例如,假设传入请求包含要搜索的字段数和值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给出。它可以包含任意数量的搜

我在Java应用程序中使用Jooq。 我从REST端点得到一个列列表(可以是零,基本上是12) 通过使用like和or来筛选我的数据库。 例如,假设传入请求包含要搜索的字段数和值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或全部)
如何编写generaljooq子句来处理这种情况第一步是认识到每个JOOQ查询都是一个查询,因此基于一些输入映射动态生成谓词非常简单。假设您具有表示字段和值的以下数据结构:

Map<String, Object> parameters = ...;
Map参数=。。。;
然后可以将其转换为如下谓词:

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
    );
条件结果=
参数
.entrySet()
.stream()
.减少(
DSL.noCondition(),
(条件、条目)->条件或(
//使用Table.field()在生成的表中按名称查找列
//如果找不到您的字段,这将导致NPE。可能需要处理该问题。。。
((Field)E.Field(entry.getKey()).eq(entry.getValue())
),
条件::或
);

第一步是认识到每个jOOQ查询都是一个查询,因此基于一些输入映射动态生成谓词非常简单。假设您具有表示字段和值的以下数据结构:

Map<String, Object> parameters = ...;
Map参数=。。。;
然后可以将其转换为如下谓词:

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
    );
条件结果=
参数
.entrySet()
.stream()
.减少(
DSL.noCondition(),
(条件、条目)->条件或(
//使用Table.field()在生成的表中按名称查找列
//如果找不到您的字段,这将导致NPE。可能需要处理该问题。。。
((Field)E.Field(entry.getKey()).eq(entry.getValue())
),
条件::或
);