Я получил этот запрос в аннотации @ SQLInsert в Spring для базы данных Oracle 11g и, хотя он вставляется правильно, он не обновляет значения, но не вызывает ошибок.
Есть идеи?Если нет, то есть ли альтернативные способы получить такое же поведение?
merge INTO ngram sn
USING(SELECT ? AS frequency,
? AS occurrences,
? AS ngram
FROM dual) src
ON (sn.ngram = src.ngram)
WHEN matched THEN
UPDATE SET sn.occurrences = sn.occurrences + src.occurrences,
sn.frequency = sn.frequency + 1
WHEN NOT matched THEN
INSERT (ngram,
frequency,
occurrences)
VALUES (src.ngram,
src.frequency,
src.occurrences)
Update1: Я добавляю определение Entity в Java для пояснения.
@Entity(name = "NGRAM")
public class Ngram
{
@Id
@JsonProperty("ngram")
private String ngram;
@JsonProperty("frequency")
@Column(name = "frequency")
private int frequency;
@JsonProperty("occurrences")
@Column(name = "occurrences")
private int occurrences;
Update2: Добавление прогона SQL-запроса к существующей Ngram
sql> merge INTO NGRAM sn
USING(SELECT 1 AS frequency,
200 AS occurrences,
'year' AS ngram
FROM dual) src
ON (sn.ngram = src.ngram)
WHEN matched THEN
UPDATE SET sn.occurrences = sn.occurrences + src.occurrences,
sn.frequency = sn.frequency + 1
WHEN NOT matched THEN
INSERT (ngram,
frequency,
occurrences)
VALUES (src.ngram,
src.frequency,
src.occurrences)
[2019-01-29 12:09:10] 1 row affected in 19 ms
Это на самом деле изменяет строку, но не когда я просматриваю их в коде, поэтому кажется, что SQLправильно ...
Update3: Итак, это фрагмент кода, который должен быть вставлен или обновлен, но он выполняет только вставку:
List<Ngram> lNgrams = new ArrayList<>(lCollocationsMap.size());
lCollocationsMap.forEach((pKey, pValue) -> lNgrams.add( new Ngram(pKey, 1, pValue)));
mNgramRepo.saveAll(lNgrams);
Так что яЯ буду исследовать поведение saveAll .
Update4: Я пытался использовать save один за другим, что намного медленнее, чем saveAll , но получил то же поведение.Изменение ON (sn.ngram = src.ngram) на ON (sn.ngram LIKE src.ngram) делает некоторые частоты равными 2 (поэтому они, похоже, обновляются)но не все из них: например, «год» появляется более 10 раз, но его частота остается равной 1, а его вхождения просто обновляются с последним найденным значением.
Итак, теперь я полностью растерялся, почему этоне удается, особенно таким образом.