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