Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向从字符串创建的查询添加限制和偏移量_Java_Jooq - Fatal编程技术网

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

Java 向从字符串创建的查询添加限制和偏移量,java,jooq,Java,Jooq,我有一个类似字符串的查询 select name from employee 并希望使用limit和offset限制行数 jOOQ有可能做到这一点吗?我该如何做到 比如: dsl.fetch("select name from employee").limit(10).offset(10); 使用字符串查询最好的方法是从中创建ResultQuery。它允许您限制底层java.sql.Statement获取的最大行数: create.resultQuery("select name from

我有一个类似字符串的查询

select name from employee
并希望使用limit和offset限制行数

jOOQ有可能做到这一点吗?我该如何做到

比如:

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

使用字符串查询最好的方法是从中创建
ResultQuery
。它允许您限制底层
java.sql.Statement
获取的最大行数:

create.resultQuery("select name from employee").maxRows(10).fetch();
或者延迟获取,然后滚动光标:

create.resultQuery("select name from employee").fetchLazy().fetch(10);
只有使用
SelectQuery
才能向查询添加偏移量或限制,但我认为在JOOQ中没有任何方法可以将字符串查询转换为
SelectQuery


实际上,如果您将SQL查询存储为数据库中的字符串,那么您已经处于非类型安全区域,最好直接将
OFFSET x LIMIT y
附加到基于字符串的查询中。根据查询的复杂性,它可能会起作用。

是的,您很接近,但您不能使用
fetch(sql)
,因为这会急切地执行查询,并且添加
LIMIT
OFFSET
将为时已晚。我通常不推荐提供的方法,因为这样,您将告诉RDBMS关于您将要做什么的信息。如果实际使用
LIMIT
OFFSET
,执行计划和资源分配可能会更好

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

使用解析器 您可以使用来解析SQL查询,然后修改生成的
SelectQuery
,或者从中创建派生表。创建派生表可能会更简洁一些:

dsl.selectFrom(dsl.parser().parse("select name from employee"))
   .limit(10)
   .offset(10)
   .fetch();
缺点是解析器必须理解您的SQL字符串。某些特定于供应商的功能将不再可用

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

使用普通SQL 您已经在使用普通SQL,但方法不对。不要急于获取数据,只需将查询封装起来,然后使用与上面相同的方法即可

当使用纯SQL时,您必须手动确保生成的SQL在语法上是正确的。这包括将查询包装在括号中,并根据您使用的方言可能对其使用别名:

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

官方文件:你有什么错误吗?不,这根本不可能。因为fetch方法的返回类型没有限制或offsetI,所以我不太了解Jooq,但是使用字符串查询不是失去了rdbms的独立性吗?如果是这样的话,我认为您需要求助于特定数据库的偏移量/限制语法。这仅仅是因为我们在数据库中存储了必须执行的SQL语句,我想限制行数。谢谢你的帮助。我决定将offset和limit附加为字符串。“要延迟获取,然后滚动光标”-确保将光标放在
try with resources
语句中,以防止资源泄漏。“但我不认为有任何方法可以在JOOQ中将字符串查询转换为SelectQuery。”-您可以随时使用。我知道一定有JOOQ解决方案