2010-01-20 13 views
1

Est-ce que quelqu'un sait comment quelle méthode Spring Jdbc modèle je pourrais utiliser pour exécuter cette «upsert» ou une approche alternative qui effectuerait également les opérations dans un appel de base de données?Spring Jdbc exécution de la requête

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

double EXACT - http://stackoverflow.com/questions/2104211/spring-jdbc-template-query-execution –

+0

Accidentellement posté deux fois, dup a été supprimé –

Répondre

3

que j'étais Transforme proche, mais oubliez une étape.

je devais changer la requête elle-même:

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 

Puis dans mon Dao ne devait utiliser Spring's JdbcTemplate update method. Il ressemble à ceci:

@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

Cela ne devrait-il pas être Not Exists?

En tout cas, je pense que cela fonctionnerait très bien sans Not Exists, puisque @@ROWCOUNT est déjà en vous donnant cette information:

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

Non, existe est sur une table différente, essentiellement, il vérifie que la contrainte de clé étrangère existe sur la table primaire, évitant ainsi une violation de clé étrangère si l'ID n'est pas dans la table 'report'. –

+0

Oh, manqué que c'était une table différente! – RedFilter