2010-01-20 104 views
1

有誰知道我可以使用Spring Jdbc模板方法來執行這個'upsert'還是另外一種方法來執行一次數據庫調用中的操作?Spring Jdbc查詢執行

UPDATE jasper_report SET Uri = 'update' WHERE ReportId = 99; 
IF @@ROWCOUNT = 0 AND Exists(Select 1 FROM report Where Id = 99) 
BEGIN 
    INSERT INTO jasper_report (ReportId, Uri) VALUES (99, 'insert') 
END; 
+1

完全相同的副本 - http://stackoverflow.com/questions/2104211/spring-jdbc-template-query-execution – 2010-01-20 19:23:35

+0

不留神發佈兩次,DUP已被刪除 – 2010-01-20 20:20:49

回答

3

原來我接近,但忘了一步。

我不得不更改查詢本身:

BEGIN 
    UPDATE jasper_report SET Uri = ? WHERE ReportId = ? 
    IF @@ROWCOUNT = 0 AND EXISTS(SELECT 1 FROM report WHERE Id = ?) 
    BEGIN 
     INSERT INTO jasper_report (ReportId, Uri) VALUES (?, ?) 
    END 
END 

然後在我的道只需要使用Spring's JdbcTemplate update method。它看起來是這樣的:

@Repository("jasperReportsDao") 
public class JasperReportsDaoImpl extends JdbcTemplate implements JasperReportsDao { 

    @Override 
    public void saveJasperReport(JasperReport report) { 
     // If a record already exists, do an update, otherwise, do an insert 
     int rowsAffected = this.update(UPSERT_JASPER_REPORT, new Object[] { report.getUri(), report.getId(), 
           report.getId(), report.getId(), report.getUri()}); 

     if(log.isDebugEnabled()) { log.debug("Rows affected: " + rowsAffected); } 
    } 
} 
1

不應該是Not Exists

在我認爲這將很好地工作,而不Not Exists無論如何,因爲@@ROWCOUNT已經給出這樣的信息:

UPDATE jasper_report SET Uri = 'update' WHERE ReportId = 99; 
IF @@ROWCOUNT = 0 
BEGIN 
    INSERT INTO jasper_report (ReportId, Uri) VALUES (99, 'insert') 
END; 
+0

沒有,存在位於不同的表上,本質上它檢查主鍵上是否存在外鍵約束,從而避免瞭如果該ID不在「報表」表中的情況下導致外鍵衝突。 – 2010-01-20 21:27:56

+0

哦,錯過了它是一個不同的表! – RedFilter 2010-01-20 21:34:09