MySQL 날짜에 저장하려고 할 때 JpaRepository SQL 구문 오류

Nov 19 2020

내 MySQL 테이블에 다음 행이 있습니다.

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

이 열은 다음과 같이 표시됩니다.

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

그리고 다음과 같이 Thymeleaf 형식에 바인딩됩니다.

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

이제 MySQL db에 직접 날짜삽입 하면 날짜가로드되고 형식에 올바른 날짜로 설정됩니다.https://i.stack.imgur.com/e35lr.png 그러나 영화를 저장하거나 편집하려고 할 때마다 다음 오류가 발생합니다.

java.sql.SQLSyntaxErrorException : SQL 구문에 오류가 있습니다. 'release ='2016-05-19 ', title ='The Shawshank Redemption ', user_name ='susan '근처에서 사용할 올바른 구문은 MySQL 서버 버전에 해당하는 설명서를 확인하십시오.

출시 날짜를 null로 설정하더라도 Hibernate는 영화를 저장하지 않습니다. 날짜에 대한 @Column을 완전히 제거하고 Thymeleaf 양식에서 제거하면 개체가 오류없이 제대로 저장됩니다. JpaRepository가 모든 쿼리를 생성하기 때문에 구문이 어떻게 잘못되었는지 알 수 없습니다. 또한 동일한 문제가있는 유형으로 표준 java.util.Date를 사용해 보았습니다.

편집 : @DateTimeFormat을 제거하면 다음 오류가 발생합니다.

[ 'movie.release'속성에 대해 'java.lang.String'유형의 속성 값을 필수 유형 'java.time.LocalDate'로 변환하지 못했습니다.]

Spring Boot 2.3.5.RELEASE 사용

답변

Thomas Nov 19 2020 at 16:21

귀하의 의견에 따르면 remoing @DateTimeFormat은 데이터베이스 매핑 문제를 해결하므로 이것이 첫 번째입니다.

다음으로 실제 엔터티에서 양식에 사용되는 데이터 전송 개체를 분리하는 것이 좋습니다. 장기적으로는 많은 도움이 될 것입니다. 당신은이 그래서 MovieDTO당신은 넣을 수있는, 결합 양식 @DateTimeFormat과 같은 다른 형태의 검증 @NotNull. 그런 다음 지속하기 전에 movieDto 개체를 영화 엔터티에 매핑해야합니다.

whereami Nov 20 2020 at 13:04

MySQL의 열 이름에 문제가있는 것으로 나타났습니다. 릴리스 는 보호 된 단어이며 사용시 쿼리에 문제가 발생합니다. 다른 열 에서처럼 이름이 자동으로 채워지지 않기 때문에 열을 삭제하려고 할 때 알아 차렸어야합니다.