jOOQ - поддержка запроса UPDATE SET с произвольной степенью

У меня есть две функции: одна возвращает список полей, другая возвращает запрос на выборку (который выбирает соответствующие значения полей).

private List<Field<?>> fields() {
    ....
}

private Select<?> select() {
    ...
}

Обратите внимание, что степень определяется во время выполнения, она зависит от пользовательского ввода. Отсюда List<Field<?>> и Select<?>.

В таблицу можно вставить:

context.insertInto(table, fields()).select(select()))

Невозможно обновить таблицу:

context.update(table).set(DSL.row(fields()), select())

Можно ли добавить эту функцию в jOOQ 3.7?

Какой обходной путь мы можем использовать сейчас?


person Community    schedule 16.08.2015    source источник
comment
Аналогичный вопрос: stackoverflow.com/q/32251307/521799   -  person Lukas Eder    schedule 28.08.2015


Ответы (1)


Хороший улов, в UpdateSetFirstStep DSL API отсутствует метод, который принимает RowN в качестве первого аргумента, тип, возвращаемый из < a href="http://www.jooq.org/javadoc/latest/org/jooq/impl/DSL.html#row-java.util.Collection-" rel="nofollow">DSL.row(Collection). Это должно быть исправлено для jOOQ 3.7: https://github.com/jOOQ/jOOQ/issues/4475

В качестве обходного пути, и если вы можете жить с чувством вины за взлом, вы можете привести к необработанным типам:

context.update(table).set((Row1) DSL.row(fields()), (Select) select())

Вы можете преобразовать DSL.row(fields()) в Row1, потому что тип внутренней реализации, возвращаемый DSL.row(fields()), реализует все типы Row[N].

person Lukas Eder    schedule 18.08.2015
comment
Виновные взломы заставляют программное обеспечение работать! Спасибо за информацию. - person ; 18.08.2015
comment
Думаю, я задал неправильный вопрос. Я ожидал, что update(table).set(row expression, select query) будет переведено в update table set field_1 = alias.field_1, field_2 = alias.field_2, ... from (select query) as alias. Но он переводится в update table set (field_1, field_2, ...) = (select query), что недопустимо для PostgreSQL. Должен ли я открыть новый вопрос для этого? - person ; 18.08.2015
comment
@KevinDeGrote: перевод выглядит интересно. Возможно, мы сможем реализовать это для более старых версий PostgreSQL. С другой стороны, PostgreSQL 9.5 теперь поддерживает этот стандартный синтаксис: postgresql.org /docs/9.5/static/sql-update.html. UPDATE .. FROM поддерживается jOOQ. Если вы не заставите его работать, не стесняйтесь задавать другой вопрос. Я буду рядом :) - person Lukas Eder; 18.08.2015
comment
Я это попробую. Единственная проблема здесь в том, что я думаю, что не могу написать это беглым стилем (поскольку мне нужно написать .set(field, value) для каждого поля). Я начинаю с List<Field<?>> и Select<?>. Хотя это не имеет большого значения. - person ; 18.08.2015
comment
@КевинДеГроте? Почему нет? Вы можете вызвать Select.asTable("alias"), а затем разыменовать отдельные поля из этой таблицы... Или я что-то упустил? - person Lukas Eder; 18.08.2015
comment
Вы, вероятно, правы. Вероятно, это можно сделать с помощью чего-то вроде update(table).set((Row1) DSL.row(fields()), (Row1) DSL.row(fields().stream().map(...).collect(Collectors.toList())).from(select().asTable("alias")). В потоке я сопоставляю поля с таблицей выбора с псевдонимом. Я попробую и дам вам знать! - person ; 19.08.2015
comment
@KevinDeGrote: О, очень интересный подход. Я не думал об этом. - person Lukas Eder; 19.08.2015
comment
Картографирование даже не понадобилось. Это отлично работает: context.update(table).set((Row1) DSL.row(fields()), (Row1) select().fieldsRow()).from(select()). Спасибо за ваш отзыв! В jOOQ 3.7 я должен удалить приведения (Row1). - person ; 19.08.2015