当前位置: 首页 > 知识库问答 >
问题:

如何使用JOOQ或任何其他库使用以下数据构建方言敏感的SQL查询?

贲宏硕
2023-03-14

我有一个字符串列表,这些字符串将作为列作为SQL Select语句的一部分。以及另一个字符串列表,这些字符串表示要在SQL查询中联接的表。

List<String> columns = Arrays.asList("sakila.actor.first_name", "sakila.city.city",
        "sakila.category.category_id");
List<String> tables = Arrays.asList("actor", "film_actor", "film", "inventory", "store",
        "address", "city", "country", "film_category", "category");

连接条件用XML表示,如下所示。

<join type="inner" operator="=">
<!-- type can be right or left or full also -->
    <left table="rental" column="staff_id"/>
    <right table="staff" column="staff_id"/>
</join>

我已经解组了XML,并且我有代表上述XML的自定义Join对象列表。

在这些列表的帮助下,我创建了SQL select语句。但在某些情况下,该查询与MySQL和Postgres不兼容。我想支持所有数据库。如何使用JOOQ和这种列表(主要是字符串)构建这样的查询?或者事实上还有其他好的图书馆吗?我只对表示SQL的字符串感兴趣,我不必立即执行它。

我试图使用JOOQ,但似乎我需要了解一下它的API。我用例的任何示例也将是一个很大的帮助。谢谢。

共有1个答案

程和蔼
2023-03-14

任何答案在很大程度上取决于你所说的“查询在某些情况下与MySQL不兼容,在另一种情况下与Postgres不兼容”。除非您使用特定于数据库的功能,否则jOOQ构建的大多数查询都可以在不同的数据库中正常运行。幸运的是,举个简单的例子,你没有这么做。

直接回答您的问题:您可以使用可用的数据轻松地将您的XML“ON”条件转换为条件对象。在jOOQ的API中,它看起来像(假设您有一个名为create的DSLContext对象):

Condition joinCondition = fieldByName(leftTable, leftColumn).eq(fieldByName(rightTable, rightColumn));
create.select(columns)
    .from(tableByName(leftTable))
    .join(tableByName(rightTable))
    .on(joinCondition)
    .fetch();

您也可以使用查询语法,这可能更适合您的动态查询:

SelectQuery selectQuery = create.selectQuery();
selectQuery.addSelect(selectFields);
selectQuery.addFrom(leftTable);
selectQuery.addJoin(rightTable, joinCondition);

您需要迭代列数组并使用此API将它们转换为字段。这可能看起来像:

List<Field<?>> fieldColumns = new ArrayList();
for (String column : columns) fieldColumns.add(fieldByName(column.split('.')));

祝你好运!jOOQ太棒了。

 类似资料:
  • 问题内容: 我可以将H2,HSQLDB或任何其他嵌入式数据库与文件而不是文件中的数据库一起使用吗? 我打算在Android 上使用,它可以返回随机访问模式。 问题答案: H2支持可插入文件系统,该系统允许您访问zip或jar文件中的只读数据库。但是,当前没有文件系统实现。实施起来应该相对容易。最好的起点可能是FileSystemZip和FileObjectZip。

  • 问题内容: 我想返回此表中的所有内容+一列,该列表示是否在其他任何地方将记录作为外键引用。 IE: 我要退货: “引用”是指是否在数据库的任何其他表中将特定的Animal_Id作为外键引用了。我想我首先可以查询information_schema并找出哪些表包含此外键,然后使用循环和动态sql执行 有人有摘录该怎么做吗? 问题答案: 这应该做到这一点: 如果您不了解所有FK表,则可以使用系统元数据

  • 问题内容: 读完Hibernate之后:hbm2ddl.auto=正在生产中更新吗?出现了一些问题。首先,我使用Hibernate的原因是要与数据库供应商无关(无需编写10个版本的“相同” sql查询,例如tsql vs. sql)。 我的问题是在创建数据库架构(生产环境)时出现的。据我所知,我有两种选择。 hbm2dll =更新 纯sql(ddl)脚本。 在上面的主题中广泛讨论了第一种选择。第二

  • 我已经浏览了Python文档提供的信息,但我仍然有点困惑。有人可以发布示例代码来编写一个新文件,然后使用pickle将字典转储到其中吗?

  • 问题内容: 新手提出的另一个问题。我有一个php变量,用于查询数据库的值。它存储在变量$ publish中,当用户单击超链接时,它的值(在数据库中)将更改。 后台发生的事情是我正在查询数据库表中存储在$ publish变量中的某些数据。如果$ publish为空,则会在弹出窗口中添加publish.html的链接。弹出窗口将处理一个表单,并将数据添加到数据库,这意味着$ publish不再为空。我

  • 背景和问题 我们使用包含元数据的文件来描述存储在csv文件中的数据。元数据文件包含最初从中导出数据的表的结构。我们使用jooq(pro版本)为临时表生成create语句,其中加载了csv文件中的数据。生成的ddl随后由pl/sql包执行。 这通常可以正常工作,但oracle原始字段存在问题。我不知道如何创建包含oracle RAW的表,因为SQLDataType不包含RAW。 简化的可运行示例 这