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
@KevinDeGrote? Защо не? Можете да извикате 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