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

标签 java relational-database query-builder querydsl jooq

我有一个字符串列表,这些字符串将作为列成为 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 的知识。我的用例的任何示例也会有很大的帮助。谢谢。

最佳答案

任何答案很大程度上取决于您所说的“查询在某些情况下与 MySQL 不兼容,在另一种情况下与 Postgres 不兼容”的含义。 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 太棒了。

关于java - 如何使用 JOOQ 或任何其他库使用以下数据构建方言敏感的 SQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29325538/

相关文章:

CakePHP 3 - 访问查询对象的参数

java - J表:Swing: Dynamic button name is not coming

java - Android - Activity 堆栈,将当前 Activity 置于最前面并禁用后退键

hadoop - Spark 上的错误 'neither present in the group by, nor is it an aggregate function'

mysql - 改善缓慢的 MySQL 选择查询或改善数据库结构?

mysql - 留言讨论查询

java - 无法更改 Java 版本 GNU/linux

java - 从类路径中的所有 jar 文件中提取扩展 "Randomizer"的类

mysql - checkin 就像数据建模/三向关系

mysql - 在 codeigniter 查询生成器中使用 union,并在虚拟 mysql 列中进行过滤