我有类似字符串的查询
select name from employee
并且想要使用 limit 和 offset 来限制行数。
这可以用 jOOQ 实现吗?我该怎么做?
类似于:
dsl.fetch("select name from employee").limit(10).offset(10);
最佳答案
是的,你已经很接近了,但是你不能使用fetch(sql)
,因为它急切地执行查询,并且附加LIMIT
和就太晚了>偏移
。我一般不推荐 Sergei Petunin 提供的方法,因为这样,您将告诉 RDBMS 更少的有关您将要执行的操作的信息。如果您实际使用 LIMIT
和 OFFSET
,执行计划和资源分配可能会更好。
有两种方法可以实现您想要实现的目标:
使用解析器
您可以使用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/