Error de sintaxis SQL de JpaRepository al intentar guardar en MySQL Date
Tengo la siguiente fila en mi tabla MySQL:
https://i.stack.imgur.com/u0FC4.png
Esta columna se representa como:
@Column(name="release")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate release;
Y está ligado a una forma Thymeleaf así:
<label for="release">Release date</label>
<input type="date"
th:field="*{movie.release}"
th:value="*{movie.release}"
id="release"
class="form-control mb-3">
Ahora, si inserto una fecha en la base de datos de MySQL directamente, la fecha se carga y se establece en la fecha correcta en el formulario:https://i.stack.imgur.com/e35lr.png Pero cada vez que intento guardar o editar la película, aparece el siguiente error:
java.sql.SQLSyntaxErrorException: tiene un error en su sintaxis SQL; Consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar cerca de 'release =' 2016-05-19 ', title =' The Shawshank Redemption ', user_name =' susan 'where' en la línea 1
Incluso si establezco la fecha de lanzamiento en nula, Hibernate no guardará la película. Si elimino por completo la @Column para la fecha y la elimino del formulario Thymeleaf, el objeto se guarda correctamente sin errores. Debido a que JpaRepository está generando todas las consultas, no puedo ver cómo la sintaxis podría estar mal. También probé con java.util.Date estándar como el tipo con el mismo problema.
EDITAR: Eliminar el @DateTimeFormat da el siguiente error:
[Error al convertir el valor de propiedad del tipo 'java.lang.String' al tipo requerido 'java.time.LocalDate' para la propiedad 'movie.release']
Usando Spring Boot 2.3.5.RELEASE
Respuestas
Según sus comentarios, la eliminación @DateTimeFormatresuelve el problema con el mapeo de la base de datos, por lo que esto es lo primero.
A continuación, recomendaría separar los objetos de transferencia de datos utilizados para los formularios de las entidades reales. Ayudará mucho a largo plazo. Entonces tiene un MovieDTOenlace de formulario for, donde puede colocar @DateTimeFormaty otras validaciones de formulario como @NotNull. Luego, deberá asignar el objeto movieDto a la entidad de la película antes de persistir.
Resulta que el problema estaba en el nombre de la columna en MySQL: release es una palabra protegida y causa problemas con la consulta cuando se usa. Debería haberme dado cuenta cuando intenté eliminar la columna, ya que no rellenaría automáticamente el nombre como lo hace con otras columnas ...