Как построить чувствительные к диалекту запросы SQL со следующими данными, используя JOOQ или любую другую библиотеку?

1

У меня есть список строк, которые должны быть частью 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. Любой пример моего прецедента также будет большой помощью. Благодарю.

Теги:
jooq
relational-database
querydsl
query-builder

1 ответ

2
Лучший ответ

Любой ответ зависит от того, что вы подразумеваете под "запросом в некоторых случаях несовместимым с 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 - это фантастика.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню