Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Merge Lambda  [new]
Alex87
Member

Откуда:
Сообщений: 7
Как записать выражение merge через лямбда выражения:

PreparedStatement s2 = to.prepareStatement("MERGE INTO " + table2 +" target"
+ " USING (SELECT ? DictionaryId,"
+ "? RegistryId) src "

+ "ON (target.DictionaryId=src.DictionaryId)"

+ " WHEN MATCHED THEN UPDATE SET RegistryId=src.RegistryId "


+ "WHEN NOT MATCHED THEN INSERT (DictionaryId, RegistryId)"


+ " VALUES (src.DictionaryId, src.RegistryId)"

+ ";");

- это работает, теперь пробую через ламбда выражения:


PreparedStatement s2 = to.prepareStatement(
"MERGE INTO " + table2 + " target"


+ " USING (SELECT ? Id, ? Name, ? Year) src"
+ " ON (target.Id=src.Id)"


+ " WHEN MATCHED THEN UPDATE SET Name=src.Name, Year=src.Year "

+ "WHEN NOT MATCHED THEN INSERT ("+columns.stream().collect(Collectors.joining(","))+")"
+ " VALUES ("+ columns.stream().collect(Collectors.joining(","))+")"

+ ";");

смог только так, а как полностью через лямбда? Помогите плиз!
24 мар 20, 12:31    [22105014]     Ответить | Цитировать Сообщить модератору
 Re: Merge Lambda  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4489
Alex87
VALUES ("+ columns.stream().collect(Collectors.joining(","))+")"
что за изврат?
24 мар 20, 13:04    [22105039]     Ответить | Цитировать Сообщить модератору
 Re: Merge Lambda  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4489
Тебе к ваде. Он любит строки плюсовать.
24 мар 20, 13:05    [22105040]     Ответить | Цитировать Сообщить модератору
 Re: Merge Lambda  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8475
Что за топики на Sql.ru пошли (((

Если не можете научиться пользоваться Debug'ером, то как минимум откройте для себя "чудо-команду" System.out.println( .... )
24 мар 20, 13:11    [22105042]     Ответить | Цитировать Сообщить модератору
 Re: Merge Lambda  [new]
Alex87
Member

Откуда:
Сообщений: 7
пробовал заменить строку:
+ " USING (SELECT ? Id, ? Name, ? Year) src"

на

+ " USING (SELECT " + columns.stream().map((c) ->"?"+c).peek(System.out::println).collect(Collectors.joining(",")) + ") src"

не проходит
24 мар 20, 14:22    [22105086]     Ответить | Цитировать Сообщить модератору
 Re: Merge Lambda  [new]
mayton
Member

Откуда: loopback
Сообщений: 45468
Я уже писал выше что сообщество джавистов - инфантильно и подвержено каким-то странным
движениям и трендам. Типа взять старый (100% работающий императивный код) и переписать

- всё на лямбдах.
- все на асинках (Futures/Completable Futures)
- всё на аннотациях (зачем сцуко?!)

При этом что ни один из этих пунктов архитектурно не обоснован и не имеет под собой какого-либо
полезного эффекта. Так... переписать ради переписывания. ... онанизм мозга вроде как.

Ой прав был старик Пелевин почти во всех своих прогнозах.

P.S. Предполагаю что такие задачи ставят тех-лиды на собеседовании смеху ради.
24 мар 20, 14:41    [22105105]     Ответить | Цитировать Сообщить модератору
 Re: Merge Lambda  [new]
Alex87
Member

Откуда:
Сообщений: 7
Чтобы не писать километры кода, когда надо обработать кучу таблиц, а воспользоваться общим лямбда-выражением
24 мар 20, 14:58    [22105119]     Ответить | Цитировать Сообщить модератору
 Re: Merge Lambda  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8475
Alex87
не проходит

так Вы результат вывода System.out.println покажите. Хрустальный шар не умеет смотреть в адресное пространство remote компьютеров и предсказывать, что за мусор в Ваших переменных.
24 мар 20, 14:59    [22105122]     Ответить | Цитировать Сообщить модератору
 Re: Merge Lambda  [new]
mayton
Member

Откуда: loopback
Сообщений: 45468
Alex87, друг. Для этого есть обычные процедурные шаблоны такие как

- introduce procedure,
- introduce temporary variable e.t.c.

Их много. И они работают уже более 50 лет в разных языках. Основное назначение лямбды
- передать свою implicite логику в данном вызове. Как шаблон стратегия.

В твоем случае - процедура тебе поможет. Как ни странно.
+ "WHEN NOT MATCHED THEN INSERT ("+createColumnsString(columns)+")"
+ " VALUES ("+ createColumnsString(columns)+")"
24 мар 20, 15:02    [22105125]     Ответить | Цитировать Сообщить модератору
 Re: Merge Lambda  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4489
Alex87
Чтобы не писать километры кода
а вдруг ты банально ошибся?
Или непогрешим?
24 мар 20, 15:03    [22105126]     Ответить | Цитировать Сообщить модератору
 Re: Merge Lambda  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4489
mayton
В твоем случае - процедура тебе поможет. Как ни странно.
+ "WHEN NOT MATCHED THEN INSERT ("+createColumnsString(columns)+")"
+ " VALUES ("+ createColumnsString(columns)+")"
или хранимка
CALL Выполни(?,?,?,?)
24 мар 20, 15:08    [22105128]     Ответить | Цитировать Сообщить модератору
 Re: Merge Lambda  [new]
Alex87
Member

Откуда:
Сообщений: 7
Понравился классический код копирования данных из одной remote таблицы в другую:

PreparedStatement s2 = to.prepareStatement(
"INSERT INTO " + table2 + " ("
+ columns.stream().collect(Collectors.joining(","))
+ ") VALUES ("
+ columns.stream().map(c -> "?").collect(Collectors.joining(",")) + ")" );

хотелось то же проделать c merge, а процедуры это детали
24 мар 20, 15:26    [22105140]     Ответить | Цитировать Сообщить модератору
 Re: Merge Lambda  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8475
Ну проделай.

Команда это всего лишь строчка. Не суметь собрать строчку нужного вида - это нужно постараться. Не уметь пользоваться отладочной печатью или дебагером, что бы понять, какая именно строка (SQL-команда) получилась после работы Вашего кода - нужно постараться

На бесмысленные восклицания "не работает, помогите", можно получить только такой же бесмысленный ответ.

IMHO & AFAIK
24 мар 20, 15:52    [22105168]     Ответить | Цитировать Сообщить модератору
 Re: Merge Lambda  [new]
Alex87
Member

Откуда:
Сообщений: 7
Образец представлен см. выше, tracer и debug для конкретного случая, речь идет об общем случае.
24 мар 20, 16:08    [22105178]     Ответить | Цитировать Сообщить модератору
 Re: Merge Lambda  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4489
Alex87
Понравился классический код копирования данных из одной remote таблицы в другую:
ну понравилось вам переставлять ноги. Вы первый раз пошли. Вы обрадовались.
Но мы не разделяем вашей радости.
Alex87
речь идет об общем случае.
прекращай обобщать.
Рано еще.
Стас?))))))
24 мар 20, 16:13    [22105181]     Ответить | Цитировать Сообщить модератору
 Re: Merge Lambda  [new]
Alex87
Member

Откуда:
Сообщений: 7
Если крут, собери инструкцию merge на лямбде, а так пустой разговор, я пока собрал на половину и она работает
24 мар 20, 16:25    [22105193]     Ответить | Цитировать Сообщить модератору
 Re: Merge Lambda  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4489
Alex87
Если крут, собери инструкцию merge на лямбде, а так пустой разговор, я пока собрал на половину и она работает
стас, тебя выше про print спрашивали и пошаговую отладку.
24 мар 20, 16:46    [22105208]     Ответить | Цитировать Сообщить модератору
 Re: Merge Lambda  [new]
Alex87
Member

Откуда:
Сообщений: 7
Просек, как надо:

PreparedStatement s2 = to.prepareStatement(
"MERGE INTO " + table2 + " target"
+ " USING ( SELECT "+ columns.stream().map(c -> "? "+c).peek(System.out::println).collect(Collectors.joining(","))+" ) src"


// + " USING (SELECT ? Id, ? Name, ? Year) src"
+ " ON (target.Id=src.Id)"

+ " WHEN MATCHED THEN UPDATE SET " + columns.stream().map(c -> c+"=src."+c).peek(System.out::println).collect(Collectors.joining(",")) +" "
// + " WHEN MATCHED THEN UPDATE SET Name=src.Name, Year=src.Year "

+ "WHEN NOT MATCHED THEN INSERT ("+columns.stream().collect(Collectors.joining(","))+")"

+ " VALUES ("+ columns.stream().collect(Collectors.joining(","))+")"
// + " VALUES (src.Id, src.Name, src.Year)"
+ ";");
24 мар 20, 18:01    [22105279]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить