JpaRepository SQL-Syntaxfehler beim Versuch, in MySQL Date zu speichern

Nov 19 2020

Ich habe die folgende Zeile in meiner MySQL-Tabelle:

https://i.stack.imgur.com/u0FC4.png

Diese Spalte wird dargestellt als:

    @Column(name="release")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate release;

Und es ist an eine Thymeleaf-Form wie diese gebunden:

    <label for="release">Release date</label>
    <input type="date" 
      th:field="*{movie.release}"
      th:value="*{movie.release}"
      id="release" 
      class="form-control mb-3">

Wenn ich nun ein Datum direkt in die MySQL-Datenbank einfüge, wird das Datum geladen und auf das richtige Datum im Formular gesetzt:https://i.stack.imgur.com/e35lr.png Aber jedes Mal, wenn ich versuche, den Film zu speichern oder zu bearbeiten, wird folgende Fehlermeldung angezeigt:

java.sql.SQLSyntaxErrorException: Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für 'release =' 2016-05-19 ', title =' The Shawshank Redemption ', user_name =' susan 'where' in Zeile 1

Selbst wenn ich das Veröffentlichungsdatum auf null setze, wird der Film im Ruhezustand nicht gespeichert. Wenn ich die @ Spalte für das Datum vollständig entferne und sie aus dem Thymeleaf-Formular entferne, wird das Objekt ohne Fehler ordnungsgemäß gespeichert. Da JpaRepository alle Abfragen generiert, kann ich nicht erkennen, wie die Syntax falsch sein könnte. Ich habe es auch mit Standard java.util.Date als Typ mit dem gleichen Problem versucht.

BEARBEITEN: Das Entfernen von @DateTimeFormat führt zu folgendem Fehler:

[Fehler beim Konvertieren des Eigenschaftswerts vom Typ 'java.lang.String' in den erforderlichen Typ 'java.time.LocalDate' für die Eigenschaft 'movie.release']

Verwenden von Spring Boot 2.3.5.RELEASE

Antworten

Thomas Nov 19 2020 at 16:21

Laut Ihrem Feedback @DateTimeFormatbehebt Remoing das Problem mit der Datenbankzuordnung - dies ist also das erste, was Sie tun müssen.

Als nächstes würde ich empfehlen, die für die Formulare verwendeten Datenübertragungsobjekte von den tatsächlichen Entitäten zu trennen. Es wird auf lange Sicht viel helfen. Sie haben also eine MovieDTOFormularbindung, in die Sie @DateTimeFormatund andere Formularvalidierungen wie setzen können @NotNull. Anschließend müssen Sie das movieDto-Objekt der Movie-Entität zuordnen, bevor Sie fortfahren können.

whereami Nov 20 2020 at 13:04

Es stellte sich heraus, dass das Problem mit dem Spaltennamen in MySQL bestand - Release ist ein geschütztes Wort und verursacht bei Verwendung Probleme mit der Abfrage. Sollte bemerkt haben, als ich versuchte, die Spalte zu löschen, da der Name nicht automatisch ausgefüllt wird, wie dies bei anderen Spalten der Fall ist ...