java - 向从字符串创建的查询添加限制和偏移量

标签 java jooq

我有类似字符串的查询

select name from employee

并且想要使用 limit 和 offset 来限制行数。

这可以用 jOOQ 实现吗?我该怎么做?

类似于:

dsl.fetch("select name from employee").limit(10).offset(10);

最佳答案

是的,你已经很接近了,但是你不能使用fetch(sql),因为它急切地执行查询,并且附加LIMIT就太晚了>偏移。我一般不推荐 Sergei Petunin 提供的方法,因为这样,您将告诉 RDBMS 更少的有关您将要执行的操作的信息。如果您实际使用 LIMITOFFSET,执行计划和资源分配可能会更好。

有两种方法可以实现您想要实现的目标:

使用解析器

您可以使用DSLContext.parser()解析您的 SQL 查询,然后修改生成的 SelectQuery,或从中创建派生表。创建派生表可能会更清晰一些:

dsl.selectFrom(dsl.parser().parse("select name from employee"))
   .limit(10)
   .offset(10)
   .fetch();

缺点是解析器必须理解您的 SQL 字符串。某些供应商特定的功能将不再可用。

优点(从 jOOQ 3.13 开始)是,您将能够以这种方式提供带有附加转换器和数据类型绑定(bind)的生成代码,因为 jOOQ 将“知道”列是什么。

使用普通 SQL

您已经在使用普通 SQL,但方式错误。无需急切地获取数据,只需将查询包装在 DSL.table() 中即可然后使用与上面相同的方法。

使用纯 SQL 时,您必须手动确保生成的 SQL 在语法上正确。这包括将查询括在括号中,并可能为其添加别名,具体取决于您使用的方言:

dsl.selectFrom(table("(select name from employee)").as("t"))
   .limit(10)
   .offset(10)
   .fetch();

关于java - 向从字符串创建的查询添加限制和偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59576076/

相关文章:

java - 使用 JOOQ 将小数秒保存为数据库中的 TIME 数据类型

java - jooq-3.2.0和db2数据库

java - ModelMapper 与 Jooq Record 集成

java - 使用户输入的总数加倍

java - Android Studio Flamingo 出现“compileDebugJavaWithJavac”错误

java - android studio sqlite方法错误

postgresql - 执行 PostgreSQL 的 concat() 而不是 || 的方法在JOOQ?

sql - jooq 中的 CASE 语句?

java - 遍历 AttributeSet 枚举

java - 如何在java中将队列的大小加倍