动态创建 JOOQ 查询

Posted

技术标签:

【中文标题】动态创建 JOOQ 查询【英文标题】:Creating JOOQ query dynamically 【发布时间】:2012-12-12 15:08:36 【问题描述】:

我需要根据参数集动态创建 JOOQ SELECT 查询。我不知道如何动态附加它。 请帮忙

提前致谢。

【问题讨论】:

你能再明确一点吗?例如。你能提供一个你想构建的示例查询吗?你尝试了什么,你在哪里失败了? 其实我需要创建选择查询;其中我需要根据传递的参数更新 where 子句。就像从 UI 中一样,我正在传递一些过滤器并希望动态添加到我的 WHERE 条件中。 【参考方案1】:

jOOQ 有两种类型的 API 来构造查询。

允许在 Java 代码中创建内联 SQL 语句的 DSL API,例如

create.select(T.A, T.B).from(T).where(T.X.eq(3).and(T.Y.eq(5)));

允许增量 SQL 构建的“模型”API。您可以随时通过 DSL 查询对象上的getQuery() 方法访问“模型”API

此处的手册中给出了您想要执行的操作的示例:

https://www.jooq.org/doc/latest/manual/sql-building/sql-statements/dsl-and-non-dsl/

例如,可选地添加一个连接:

DSLContext create = DSL.using(configuration);
SelectQuery query = create.selectQuery();
query.addFrom(AUTHOR);

// Join books only under certain circumstances
if (join)
    query.addJoin(BOOK, BOOK.AUTHOR_ID.equal(AUTHOR.ID));

Result<?> result = query.fetch();

或者,可选择添加条件/谓词:

query.addConditions(BOOK.TITLE.like("%Java%"));
query.addConditions(BOOK.LANGUAGE_CD.eq("en"));

更新:鉴于您的 cmets,这就是您要寻找的:

// Retrieve search strings from your user input (just an example)
String titleSearchString = userInput.get("TITLE");
String languageSearchString = userInput.get("LANGUAGE");
boolean lookingForTitles = titleSearchString != null;
boolean lookingForLanguages = languageSearchString != null;

// Add only those conditions that the user actually provided:
if (lookingForTitles)
    query.addConditions(BOOK.TITLE.like("%" + titleSearchString + "%"));
else if (lookingForLanguages)
    query.addConditions(BOOK.LANGUAGE_CD.eq(languageSearchString));

注意,您也可以使用Field.compare(Comparator, Object) 方法:

// Initialise your dynamic arguments
Field<String> field = BOOK.TITLE;
Comparator comparator = Comparator.LIKE;
String value = "%" + titleSearchString + "%";

// Pass them to the field.compare() method
query.addConditions(field.compare(comparator, value));

有关更多信息,请考虑org.jooq.SelectQuery Javadoc

【讨论】:

但我还有一个问题。我可以在查询中使用 java 变量吗(特别是在 addConditions 部分),以便我可以在运行时放置这些变量的值。例如。列名。 @user1900723:是什么阻止您将这些元素分配给 Java 中的变量? 让我解释一下这个场景。实际上我有一些列,我必须在表中搜索。例如:姓名、ID、日期。我需要根据它们获取数据,还有另一个参数,其中包含 EQUAL TO、BEGINS WITH(需要使用 like 运算符)、ENDS WITH(需要使用 like 运算符)等值。我需要动态地做这一切。所以,需要使用变量,以便我可以将值放在飞行中。如果您需要进一步说明,请告诉我。我被困在这里了。 @user1900723:我明白你想要做什么。但是到目前为止,您已经尝试过什么?你到底卡在哪里了?随时更新(编辑)您的问题以添加更多信息 我实际上无法理解如何在 addConditions 函数中动态添加那些 EQUAL 和 LIKE 函数。如果您能给我一个非常简短的示例代码,那就太好了。正如我目前所读到的,我们可以在运行时使用 SelectQuery 工厂进行 Jooq 查询,还可以动态添加条件和连接。但是如何添加这些运算符(Like 和 Equal)。

以上是关于动态创建 JOOQ 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 jooq 创建查询字符串时转义单引号?

如何将ACCESS的表和查询创建成动态的WEB?

使用动态复杂查询创建表

如何为元素数组动态创建查询?

创建动态 SQL 查询的问题

Spring Cloud OpenFeign 创建动态查询参数失败