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

How do I build dialect sensitive SQL queries with the following data using JOOQ or any other library?

我有一个字符串列表,这些字符串将作为列作为 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");

JOIN ON 条件表示为 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。我的用例的任何示例也将有很大帮助。谢谢。

任何答案在很大程度上取决于您 "the query is not compatible with MySQL in some cases and Postgres in another case" 的意思。大多数由 jOOQ 构建的查询将 运行 在不同的数据库中正常运行,除非您使用特定于数据库的功能。幸运的是,根据您的简短示例,您没有这样做。

直接回答您的问题:您可以轻松地将 XML "ON" 条件转换为具有可用数据的 Condition 对象。在 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 太棒了。