当前位置: 首页 > 面试题库 >

运行时SQL查询生成器

奚才良
2023-03-14
问题内容

然而,从上述线程中摘录的一个重要观点是:

Querydsl和jOOQ似乎是最流行和最成熟的选择,但是需要注意的一件事: 两者都依赖于代码生成的概念,
即为数据库表和字段生成元类。这有助于建立一个漂亮,干净的DSL,但是 在尝试为仅在运行时才知道的数据库创建查询时会遇到问题

除了仅使用纯JDBC +字符串串联外,还有什么方法可以在运行时创建查询吗?

我正在寻找的是一个Web应用程序,可用于构建表单以查询现有数据库。现在,如果已经存在类似此类产品的链接,那么也将很受欢迎。


问题答案:

尽管生成数据库元数据的源代码无疑为使用jOOQ增添了很多价值,但这不是前提条件。许多jOOQ用户将jOOQ用于您设想的相同用例。jOOQ教程中也反映了这一点,该教程将使用没有代码生成的jOOQ列为完全有效的用例。例如:

String sql = create.select(
                        fieldByName("BOOK","TITLE"), 
                        fieldByName("AUTHOR","FIRST_NAME"), 
                        fieldByName("AUTHOR","LAST_NAME"))
                   .from(tableByName("BOOK"))
                   .join(tableByName("AUTHOR"))
                   .on(fieldByName("BOOK", "AUTHOR_ID").eq(
                        fieldByName("AUTHOR", "ID")))
                   .where(fieldByName("BOOK", "PUBLISHED_IN").eq(1948))
                   .getSQL();

以类似的方式,可以使用Query.getBindValues()从任何查询中提取绑定值。

对于动态SQL语句,这种方法仍将优于普通的JDBC +字符串连接,因为您无需担心:

  • 语法正确性
  • 跨数据库兼容性
  • SQL注入
  • 绑定变量索引

(免责声明:我为jOOQ的供应商工作)



 类似资料:
  • 我想在运行时生成的SQLite数据库上运行查询(而不是@Dao中的标准compiletime查询)。例如,我可能想在SQLite数据库中搜索一个文本列,看看它是否包含N个长度的列表中的所有单词。在原始SQLITE中,N为3的查询如下所示: 我尝试过生成并传递查询的结尾,而不是仅仅传递变量。例如: 在@Dao中: 这似乎对我不起作用。你知道如何让运行时生成的查询与Room一起工作吗? 附言:

  • 但是生成的SQL查询是 正如您所看到的,括号改变了,我相信两个查询中的条件并不相同。是虫子吗?使用hibernate和spring以及postgresql数据库。

  • 以下是Liquibase输入文件: --更改集dank:1 runalways=true failonerror:false 删除表aaa_schema.foo IBM错误代码-104是关于语法问题的。根据查看错误消息,我猜测它与行尾字符“;”有关。但是我已经尝试了使用分号和不使用分号的查询。IBM自己的db2也接受分号,因此它似乎是一个有效的选择。 非常感谢在找出此错误原因方面的任何帮助。

  • 我一直在理解Laravel查询生成器和纯SQL之间的融合。 我有2张桌子: user:包含具有主键的用户 User_Action:这是一个表,其中包含由和动作的组成的PRIMARYs记录。 ex: 使用者 用户操作 我的需要: 现在我想检索一个用户列表,其中包含每个用户的最新操作。因此,我只需要在从到的连接中获取一行,并且这一行必须是具有最新日期时间的一行。我的前任也是如此;我只想获取dateti

  • 问题内容: 我已经在mysql上创建了HEAP(ram)表,以实现更快的查询。但是在mysql服务器重启后,我的堆表中的数据没有被加载。 我的正常的表名: 产品 与ID,PRODUCT_NAME,地位的MyISAM id = >整数和auto_increment,主键 product_name = > var_char和键(索引) 状态= >布尔值 实际查询: 我想提高速度,所以我创建了具有相同结

  • 问题内容: 说我长时间运行更新查询 some_table中的modification_time的值是什么?它们是相同还是不同(例如,执行查询花了2天的时间)。 如果它们不同,如​​何编写此查询以使它们都相同? 问题答案: 它们都是一样的,因为NOW()在查询开始时被锁定了。 答案太短了吗? 好的,更多信息有关NOW()的MySQL参考 NOW()返回一个 恒定时间 ,该时间指示该语句 开始执行的时