eps*_*ero 5 sql oracle oracle11g spring-data-jpa
我在Spring中针对Oracle 11g数据库的@SQLInsert注释中获得了此查询,虽然它正确插入但它不会更新值但不会引发错误.
有任何想法吗?如果没有,任何其他方式获得相同的行为?
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)
Run Code Online (Sandbox Code Playgroud)
Update1:我在Java中添加了Entity def以便澄清.
@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;
Run Code Online (Sandbox Code Playgroud)
Update2:在现有Ngram上添加SQL查询的运行
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
Run Code Online (Sandbox Code Playgroud)
这实际上修改了行,但是当我在代码中查看它们时却没有,所以看起来SQL是正确的......
Update3:所以,这是应该插入或更新的代码段,但它只执行插入:
List<Ngram> lNgrams = new ArrayList<>(lCollocationsMap.size());
lCollocationsMap.forEach((pKey, pValue) -> lNgrams.add( new Ngram(pKey, 1, pValue)));
mNgramRepo.saveAll(lNgrams);
Run Code Online (Sandbox Code Playgroud)
所以我将调查saveAll行为.
Update4:我尝试逐个使用save,这比使用saveAll慢得多但行为相同.将ON(sn.ngram = src.ngram)更改为ON(sn.ngram LIKE src.ngram)会使某些频率变为2(因此它们似乎已更新)但不是全部:例如"年"出现超过10次,但它的频率仍为1,它的出现只是更新了最后找到的值.
所以,我现在完全迷失了为什么会失败,特别是这样.
| 归档时间: |
|
| 查看次数: |
173 次 |
| 最近记录: |