2013-12-10 4 views
8

Ich habe eine Tabelle in MYSQL und ich verwende JDBC-Vorlagen, um eine Einfügung in diese Tabelle.Warum verwendet Spring JDBC Templates nicht die Tabellen Standardwert

Eine der Spalten hat einen Standardwert, und ich gebe es nicht in der Map<String, Object> parameters Karte an.

Ich bekomme eine Ausnahme Column 'colName' cannot be null.

Kann mir bitte jemand erklären?

Dank

* Edit: Code *

contactDetailsInsertTemplate = new SimpleJdbcInsert(dataSource).withTableName("contactdetails").usingGeneratedKeyColumns("contactcode"); 
Map<String, Object> parameters = new HashMap<String, Object>(); 
Number newId = contactDetailsInsertTemplate.executeAndReturnKey(parameters); 
+0

Bitte zeigen Sie den Code, den Sie verwenden. –

Antwort

11

Sie müssen die im SQL-Insert angegebenen Spalten begrenzen.

Siehe SimpleJdbcInsert.usingColumns()

Wenn Sie dies nicht tun, die SQL-Anweisung Werte für alle Spalten benötigen und die Standardwerte können nicht verwendet werden.

z.B. verwenden

insert into mytable (col1, col2) values (val1, val2); 

statt

insert into mytable values (val1, val2); 
1

INSERT INTO mytable (1,null) ist nicht das gleiche wie INSERT INTO mytable (1). Der vorherige fügt null ein, der später die Entscheidung an den DB überlässt (was der Standardwert wäre). Spring JDBC macht das ehemalige.

+0

Danke für die Antwort. Beide Antworten sind korrekt, aber NickJs Antwort ist genauer für die spezifische Frage. Ich wünschte, ich könnte euch beide akzeptieren, aber ich werde ihn akzeptieren und euch auffordern :). – Gleeb

1

Das Problem ist, woanders: Wenn ich SimpleJdbcInsert verwenden und eine Karte von Parametern, um es passieren, ich einfachen Einsatz statment nur mit Parametern erstellen erwarte ich, zur Verfügung gestellt. Ich habe eine NOT NULL-Spalte in der Tabelle mit DEFAULT-Wert, und ich möchte es nicht angeben. Ich möchte auch nicht alle Spaltennamen explizit in usingColumns() setzen, wie ich es gerade beim Erstellen einer Karte von Parametern getan habe! Warum sollte ich es nochmal machen? Das Problem ist, dass SimpleJdbcInsert klüger sein soll und alle Spalten hinzufügen, um eine Anweisung einzufügen, die nicht notwendig ist. Warum erstellen Sie eine Anweisung nicht nur mithilfe von Spalten, die mit der Parameterzuordnung bereitgestellt werden?

Siehe: http://forum.spring.io/forum/spring-projects/data/54209-simplejdbcinsert-and-columns-with-default-values

0

Sie die Spalten hinzufügen können, die einen Standardwert als Parameter an usingGeneratedKeyColumns() haben.
Spaltennamen, die als Parameter dieser Methode enthalten sind, werden in der generierten INSERT-Anweisung weggelassen.

Verwandte Themen