jooq 的限制和偏移量问题

2024-05-10

我已将 jooq 与 spring 集成,对于对数据库(MySQL)的所有类型的查询,我使用 spring 的 JDBC 模板。这里使用 jooq 库生成 sql 查询以传递给 jdbc 模板。

尽管我的其余查询工作正常,直到我向查询添加限制和/或偏移量。

我生成查询如下:

create.select(Factory.field("table_name"))
      .from("tables t")
      .where("t.table_schema LIKE '" + schemaName + "'")
      .limit(10)
      .offset(2)
      .getSQL();

我收到错误如下:

org.springframework.jdbc.BadSqlGrammarException:StatementCallback; 错误的 SQL 语法 [select table_name from table t where (t.table_schema 像“测试”)限制?抵消 ?];嵌套异常是 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您有一个 SQL 语法错误;检查与您对应的手册 MySQL 服务器版本,以便在 '? 附近使用正确的语法。抵消 ?'在 1号线

这清楚地表明传递给 limit 和 offset 方法的值不会附加到查询中。

我搜索了文档,但没有找到任何其他方法来实现此目的。


jOOQ 生成带有绑定值的 SQL。当您使用 jOOQ 仅渲染 SQL,并使用 Spring 执行它时,您基本上可以选择以下任何一个:

显式使用内联绑定值:

像这样,你可以明确告诉 jOOQ 不要为你的对象渲染任何绑定变量LIMIT .. OFFSET clause

create.select(DSL.field("table_name"))
      .from("tables t")
      .where("t.table_schema LIKE '" + schemaName + "'")
      .limit(DSL.inline(10))
      .offset(DSL.inline(2))
      .getSQL();

让 jOOQ 内联所有绑定值:

像这样,你可以告诉 jOOQ 不要渲染任何绑定变量:

Settings settings = new Settings();
settings.setStatementType(StatementType.STATIC_STATEMENT);
DSLContext create = DSL.using(connection, dialect, settings);
// [...]

从 jOOQ 的查询中提取绑定值:

像这样,你可以让 jOOQ 在适当的地方渲染绑定变量,并以正确的顺序提取它们:

Query query =
create.select(DSL.field("table_name"))
      .from("tables t")
      .where("t.table_schema LIKE '" + schemaName + "'")
      .limit(DSL.inline(10))
      .offset(DSL.inline(2));

String sql = query.getSQL();
List<Object> bindValues = query.getBindValues();

有关 jOOQ 对绑定值的理解的更多信息:

http://www.jooq.org/doc/latest/manual/sql-building/bind-values/ http://www.jooq.org/doc/latest/manual/sql-building/bind-values/

关于语法完整性和 SQL 注入的注意事项

请注意,您的查询有些容易出错,因为schemaName如果它源自用户输入,则应进行检查和转义。您可以为其创建一个绑定值,如下所示:

create.select(DSL.field("table_name"))
      .from("tables t")
      .where("t.table_schema LIKE ?", schemaName)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jooq 的限制和偏移量问题 的相关文章

随机推荐

  • 如何提取括号(圆括号)之间的文本?

    我有一根绳子User name sales 我想提取括号之间的文本 我该怎么做 我怀疑子字符串 但我无法弄清楚如何阅读 直到右括号 文本的长度会有所不同 如果您希望远离正则表达式 我能想到的最简单的方法是 string input User
  • 如何将数字格式化为货币字符串

    我想用 JavaScript 格式化价格 我想要一个需要一个函数float作为参数并返回string格式如下 2 500 00 我怎样才能做到这一点 国际数字格式 https developer mozilla org en US docs
  • 如何在 Swiftui 中使列表项行内的按钮不可点击?

    有没有办法让列表的整行都不可点击 我正在尝试使按钮行上只有按钮可单击 正如您所看到的 如果我尝试单击按钮行中的任何位置 无论是按钮本身 还是按钮周围的空白区域 它都会将其视为点击 有没有办法让您只能单击按钮本身 而不能单击按钮周围的白色间距
  • 为格子中的每个面板添加不同的独特标签

    很清楚如何在格子中标记面板 https stackoverflow com questions 8508269 how to label panels in lattice using panel text or ltext论据 但是 如果
  • asp.NET 2.0网站无法访问App_Code中的类

    将我的网站部署到服务器后 我在访问课程时遇到问题 请注意 这是一个网络Site不是网络应用 错误是 编译器错误消息 CS0246 找不到类型或命名空间名称 Order 是否缺少 using 指令或程序集引用 版本信息 Microsoft N
  • 获取动态图像的宽度和高度

    我有一个img嵌入隐藏标签内div 当用户单击具有图像名称的动态超链接时 图像必须显示在模式窗口中 为了将 div 定位在模态窗口内 需要图像高度 但是当点击超链接后 src被分配 高度为0 所以图像不能在中间对齐 请帮助我在浏览器中显示图
  • 将 Python 中创建的 pandas 数据框插入 SQL Server

    如前所述 我在 Python 中创建了一个数据集合 40k 行 5 列 我想将其插入 SQL Server 表中 通常 在 SQL 中我会做一个 select into myTable from dataTable 调用来执行插入 但是 p
  • 什么是悲观主义?

    该问题有评论可以使用C 11的吗auto提高性能 https stackoverflow com questions 32510183 can the use of c11s auto improve performance这获得了很多选票
  • 从 CSV 输入 Python 中查找最后一行

    我没有真正找到与我的问题相关的示例 因为我不了解 Pandas 所以我将其发布在这里 如果不清楚或已经得到答复 请告诉我 我有一个 CSV 输入 我像这样导入 def import csv csvfilename data with ope
  • 生成 C / C++ 代码时表达式的结合性和优先级?

    我编写了一个生成 AST 的基本编译器 正确考虑了表达式中运算符的优先级 但是 在执行代码生成以生成 C 代码时 我不确定如何处理括号的使用 对于这个表达式 A B c AST如下 A B C 应该正确生成包含括号的前一个表达式 但是如果第
  • C#中的FsCheck:生成形状相同的二维数组列表

    假设我正在编写一些用于视频分析的代码 这是 Video 类的简化版本 public class Video public readonly int Width public readonly int Height public readon
  • 一种简单、干净的方式来切换/交换视图?

    我已经看了几个来源 但我仍然很困惑 我想创建一个具有多个视图的应用程序 只有标准视图 没有表视图或其他任何内容 我可以在其中单击每个视图上的按钮来访问其他视图 我已经看到了多种方法来做到这一点 但对我来说唯一有意义的方法是让应用程序委托负责
  • 在 ionic 中从 Base64 打开 pdf

    因此 我将 Jasper 报告转换为 pdf 然后在 REST 控制器中转换为 base64 我该如何将其传输到我的 ionic 3 应用程序 我研究了 Ionic Native Document Viewer 但为了做到这一点 我需要将文
  • Java:带有 unicode 字符的 String.toCharArray()

    我知道 char 不能包含 Unicode 字符 例如 char c u1023 那么我该怎么做 String s ABCDEFG u1023 char c s toCharArray 出于性能原因 我想将 s 转换为 CharArray
  • 枚举和 Clojure

    在Java C世界中 人们经常使用枚举 如果我使用的是使用枚举的 Java 库 我可以在它们和关键字之间进行转换 例如 使用 java lang Enum valueOf e aget Ljava lang Enum e getEnumCo
  • R 中使用 randomForest 进行内存高效预测

    TL DR我想知道使用基于大型数据集 数百个特征 数十万行 构建的随机森林模型执行批量预测的内存有效方法 Details 我正在处理一个大型数据集 内存中超过 3GB 并且想要使用以下方法进行简单的二进制分类randomForest 由于我
  • Phantom JS 50% 的时间失败

    我搜索一个文本框 然后尝试用字符串填充它 这是代码 var fname driver FindElement By Name iFirstName 50 if fname null do System Threading Thread Sl
  • python:获取上两层目录

    好吧 我不知道模块在哪里x是 但我知道我需要向上两层目录的路径 那么 有没有更优雅的方法 import os two up os path dirname os path dirname file 欢迎提供适用于 Python 2 和 3
  • 为使用 conda 安装的仅标头库设置包含路径

    最近有人建议我作为包管理器查看 conda 不幸的是 我没有成功地找到如何让我的编译器找到与 conda 安装的仅标头库 理想情况下 我希望根本不必手动指定编译器的路径 上下文是我来自 macOS 上的自制软件 它会在正确的位置创建符号链接
  • jooq 的限制和偏移量问题

    我已将 jooq 与 spring 集成 对于对数据库 MySQL 的所有类型的查询 我使用 spring 的 JDBC 模板 这里使用 jooq 库生成 sql 查询以传递给 jdbc 模板 尽管我的其余查询工作正常 直到我向查询添加限制