当前位置: 首页 > 知识库问答 >
问题:

是否可以更改jOOQ DSL查询的select/where

柏高丽
2023-03-14

例如:

DSLContext ctx = ...;
SelectHavingStep query = ctx.select(MyEntity.MY_ENTITY.ZIP, DSL.count(MyEntity.MY_ENTITY.ZIP))
   .from(MyEntity.MY_ENTITY)
   .where(MyEntity.MY_ENTITY.ID.gt("P"))
   .groupBy(MyEntity.MY_ENTITY.ZIP);

用例1:

我想将上面的查询传递给一个实用工具类,该类将只使用不同的SELECT生成相同的查询,例如:

ctx.select(DSL.count())
   .from(MyEntity.MY_ENTITY)
   .where(MyEntity.MY_ENTITY.ID.gt("P"))
   .groupBy(MyEntity.MY_ENTITY.ZIP);
SelectHavingStep query = 
  ctx.select(MyEntity.MY_ENTITY.ZIP, DSL.count(MyEntity.MY_ENTITY.ZIP))
     .from(MyEntity.MY_ENTITY)
     .where(
        MyEntity.MY_ENTITY.ID.gt("P")
        .and(MyEntity.MY_ENTITY.ZIP.in("100", "200", "300"))
      )
     .groupBy(MyEntity.MY_ENTITY.ZIP);

目前,我在应用程序代码中的查询构造时使用助手类来完成这一任务。我想把责任转移到一个库,这样它就可以透明地强制应用程序。

谢了。

共有1个答案

赵俊晤
2023-03-14

您不应该尝试更改jOOQ对象,而是应该尝试以函数的方式动态地创建它们。有不同的方法来实现您的用例,例如。

这里可以看到一种通用分页查询方法:https://blog.jooq.org/computing-pagination-metadata-nowle-extrata-roundtrips-in-sql/

理想情况下,可以避免count(*)查询的额外往返,并使用count(*)OVER()窗口函数。如果在您的SQL方言中没有,那么您可以这样做:

public ResultQuery<Record> mySelect(
    boolean count,
    Supplier<List<Field<?>>> select,
    Function<? super SelectFromStep<Record>, ? extends ResultQuery<Record>> f
) {
    return f.apply(count ? ctx.select(count()) : ctx.select(select.get()));
}
mySelect(false, 
    () -> List.of(MY_ENTITY.ZIP),
    q -> q.from(MY_ENTITY)
          .where(MY_ENTITY.ID.gt("P"))
          .groupBy(MY_ENTITY.ZIP)
).fetch();

只需将上面的示例更进一步,并提取用于在另一个函数中创建WHERE子句的逻辑,例如。

public Condition myWhere(Function<? super Condition, ? extends Condition> f) {
    return f.apply(MY_ENTITY.ID.gt("P"));
}

现在按如下方式使用它:

mySelect(false, 
    () -> List.of(MY_ENTITY.ZIP),
    q -> q.from(MY_ENTITY)
          .where(myWhere(c -> c.and(MY_ENTITY.ZIP.in("100", "200", "300")))
          .groupBy(MY_ENTITY.ZIP)
).fetch();

同样,有许多不同的方法来解决这个问题,这取决于什么是“公共部分”,什么是“用户定义的部分”。您还可以对my_entity表进行抽象,并传递生成实际表的函数。

    null
 类似资料:
  • 我正在使用一个相当大的数据集(大约500Mio-Triples)存储在图形数据库免费并在我的本地开发人员机器上运行。 我想用RDF4J对数据集执行一些操作,并且必须或多或少地选择整个数据集。要进行测试,我只需选择所需的元组。代码在第一个一百万元组中运行良好,之后由于graphDB继续分配更多的RAM,速度变得非常慢。 是否有可能对非常大的数据集执行选择查询并批量获取它们? 基本上,我只想通过一些选

  • 问题内容: 是否可以“监视”指令上的ui更改?像这样的东西: 问题答案: 是。您可以使用,如果你在属性利用插值。 但是,如果这不是一个插值属性,并且您希望它可以从应用程序中的其他位置更改(绝对不建议这样做,请阅读Common Pitfalls ),那么函数可以返回: 无论如何,对您来说最好的方法可能是更改更改元素类的代码。它何时更改?

  • 问题内容: 我想知道是否可以在@Query批注中包含子查询(org.springframework.data.jpa.repository.Query;) 我在第一个子查询括号上得到QuerySyntaxException。 这是我的查询 谢谢! 问题答案: 不可以,JPQL查询的select子句中不能包含子查询。 JPQL在WHERE和HAVING子句中支持子查询。它可以(至少)是ANY,SOM

  • 问题内容: 好吧,我是SQL的新手,我刚刚读到,存储过程始终返回一个值,确定该过程中的查询是否已成功执行是一种很好的做法。 所以我有一个带有select语句的简单存储过程,如果要执行,我想返回1,否则返回-1。 您能告诉我如何用SQL编写该条件吗? 如果有关系,我的数据库是MS SQL Server。 谢谢你。 问题答案: 使用输出参数返回成功状态以及Try..Catch块

  • 我正在尝试返回Json文件的内容。但是我想在将其发送到前端之前进行修改。我想在文件的开头和结尾添加“[”和“]”。我这样做是因为json文件有。 例如,提取结果,如图所示 问题 是否可以更改响应主体并将其放回ResponseEntity? 源代码

  • 我试图只获得新版本的行已更改,而不是git diff显示的所有其他信息。 用于: 它显示: 我想看到的只是: 可能吗?