У меня есть список строк, которые должны быть частью 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>
Я unmarshalled XML, и у меня есть список пользовательских объектов Join, представляющих вышеупомянутый XML.
С помощью этих списков я создал инструкцию SQL select. Но в некоторых случаях запрос несовместим с MySQL, а Postgres - в другом случае. Я хочу поддерживать все базы данных. Как я могу создавать такие запросы с помощью JOOQ с такими списками, в основном, строками? или На самом деле любая другая хорошая библиотека? Меня просто интересует строка, представляющая SQL, и мне не нужно ее немедленно выполнять.
Я пытался использовать JOOQ
но мне кажется, мне нужно немного узнать о его API. Любой пример моего прецедента также будет большой помощью. Благодарю.
Любой ответ зависит от того, что вы подразумеваете под "запросом в некоторых случаях несовместимым с MySQL, а Postgres - в другом случае". Большинство запросов, созданных jOOQ, будут отлично работать в разных базах данных, если только вы не используете функциональные возможности, специфичные для конкретной базы данных. К вашему краткому примеру, к сожалению, вы этого не делаете.
Чтобы прямо ответить на ваш вопрос: вы можете легко превратить свое условие "ON" в объект Condition с имеющимися данными. В jOOQ API он будет выглядеть примерно так (если у вас есть объект DSLContext, называемый create
):
Condition joinCondition = fieldByName(leftTable, leftColumn).eq(fieldByName(rightTable, rightColumn));
create.select(columns)
.from(tableByName(leftTable))
.join(tableByName(rightTable))
.on(joinCondition)
.fetch();
В качестве альтернативы вы можете использовать синтаксис Query, который может работать лучше для ваших динамических запросов:
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 - это фантастика.