Błąd składni języka SQL JpaRepository podczas próby zapisania do MySQL Date

Nov 19 2020

W mojej tabeli MySQL mam następujący wiersz:

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

Ta kolumna jest reprezentowana jako:

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

I jest związany z formą Thymeleaf, taką jak:

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

Teraz, jeśli wstawię datę bezpośrednio do bazy danych MySQL, data jest ładowana i ustawiana na poprawną datę w formularzu:https://i.stack.imgur.com/e35lr.png Ale za każdym razem, gdy próbuję zapisać lub edytować film, pojawia się następujący błąd:

java.sql.SQLSyntaxErrorException: Wystąpił błąd w składni SQL; sprawdź podręcznik, który odpowiada Twojej wersji serwera MySQL, aby uzyskać właściwą składnię, której należy użyć w pobliżu 'release =' 2016-05-19 ', title =' The Shawshank Redemption ', user_name =' susan 'gdzie' w linii 1

Nawet jeśli ustawię datę premiery na zero, Hibernacja nie zapisze filmu. Jeśli całkowicie usunę @Column dla daty i usunę ją z formularza Thymeleaf, obiekt zostanie poprawnie zapisany bez błędów. Ponieważ JpaRepository generuje wszystkie zapytania, nie wiem, dlaczego składnia może być błędna. Próbowałem również ze standardowym java.util.Date jako typem z tym samym problemem.

EDYCJA: Usunięcie @DateTimeFormat powoduje następujący błąd:

[Nie udało się przekonwertować wartości właściwości typu „java.lang.String” na wymagany typ „java.time.LocalDate” dla właściwości „movie.release”]

Używanie Spring Boot 2.3.5.RELEASE

Odpowiedzi

Thomas Nov 19 2020 at 16:21

Zgodnie z twoją opinią, ponowne usunięcie @DateTimeFormatrozwiązuje problem z mapowaniem bazy danych - więc to jest pierwsza rzecz.

Następnie zalecałbym oddzielenie obiektów transferu danych używanych w formularzach od rzeczywistych podmiotów. To bardzo pomoże na dłuższą metę. Masz więc MovieDTOdo wiązania formularzy, w którym możesz umieścić @DateTimeFormati inne walidacje formularzy, takie jak @NotNull. Następnie będziesz musiał zmapować obiekt movieDto do encji filmu przed utrwaleniem.

whereami Nov 20 2020 at 13:04

Okazuje się, że problem dotyczy nazwy kolumny w MySQL - release jest słowem chronionym i powoduje problemy z zapytaniem, gdy jest używane. Powinienem był zauważyć, kiedy próbowałem upuścić kolumnę, ponieważ nie wypełniłby automatycznie nazwy, tak jak w przypadku innych kolumn ...