动态创建 JOOQ 查询

13
我需要基于参数集动态创建JOOQ SELECT查询。我不知道如何动态附加它。请帮忙。 提前致谢。

2
你能再明确一些吗?例如,你能提供一个你想构建的查询示例吗?你尝试过什么,哪里失败了? - Lukas Eder
实际上,我需要创建一个选择查询;其中,根据传递的参数更新WHERE子句。例如,从UI中传递了一些过滤器,并且希望动态添加到我的WHERE条件中。 - user1900723
1个回答

35
jOOQ有两种API来构建查询。
  • The DSL API that allows for creating inline SQL statements in your Java code, e.g.

    create.select(T.A, T.B).from(T).where(T.X.eq(3).and(T.Y.eq(5)));
    
  • The "model" API that allows for incremental SQL building. At any time, you can access the "model" API through the getQuery() method on a DSL query object

手册中提供了您想要做的示例:

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"));

更新:鉴于您的评论,以下是您要查找的内容:

// 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
@user1900723:是什么阻止你在Java中将这些元素分配给变量? - Lukas Eder
就像在普通的Mysql查询中一样,我会检查参数是否相等、以某个字符结尾或以某个字符开头,然后相应地使用"="或"like"运算符附加where子句。由于它只是一个字符串,所以我可以轻松地附加它。我想在Jooq中做同样的事情。 - user1900723
@user1900723:好的,我想我已经给你足够的信息了。现在你可以自己尝试一下。如果你找到了不同的解决方案,请随时在 Stack Overflow 上发布答案。我建议你也阅读一下 Stack Overflow FAQ,这将有助于你在未来更轻松地获得更简明的答案。 - Lukas Eder
@LukasEder,我们能否使用普通的Select SQL语句来利用dslcontext.execute()方法?这样只需要构建动态字符串SQL查询。这也可能是实现上述用例的一种方式。 - codiacTushki
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接