Erreur de syntaxe SQL JpaRepository lors de la tentative d'enregistrement dans MySQL Date

Nov 19 2020

J'ai la ligne suivante dans ma table MySQL:

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

Cette colonne est représentée par:

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

Et il est lié à une forme Thymeleaf comme ceci:

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

Maintenant, si j'insère une date directement dans la base de données MySQL, la date est chargée et définie sur la date correcte sur le formulaire:https://i.stack.imgur.com/e35lr.png Mais chaque fois que j'essaye d'enregistrer ou de modifier le film, j'obtiens l'erreur suivante:

java.sql.SQLSyntaxErrorException: Vous avez une erreur dans votre syntaxe SQL; Vérifiez le manuel qui correspond à votre version de serveur MySQL pour la bonne syntaxe à utiliser près de 'release =' 2016-05-19 ', title =' The Shawshank Redemption ', user_name =' susan 'where' à la ligne 1

Même si je règle la date de sortie sur null, Hibernate ne sauvegardera pas le film. Si je supprime complètement la @Column pour la date et la supprime du formulaire Thymeleaf, l'objet est enregistré correctement sans erreurs. Parce que JpaRepository génère toutes les requêtes, je ne vois pas comment la syntaxe pourrait être erronée. J'ai également essayé avec java.util.Date standard comme type avec le même problème.

EDIT: la suppression de @DateTimeFormat donne l'erreur suivante:

[Échec de la conversion de la valeur de propriété de type 'java.lang.String' en type requis 'java.time.LocalDate' pour la propriété 'movie.release']

Utilisation de Spring Boot 2.3.5.RELEASE

Réponses

Thomas Nov 19 2020 at 16:21

Selon vos commentaires, la suppression @DateTimeFormatrésout le problème de mappage de la base de données - c'est donc la première chose.

Ensuite, je recommanderais de séparer les objets de transfert de données utilisés pour les formulaires des entités réelles. Cela aidera beaucoup à long terme. Vous avez donc une MovieDTOliaison de formulaire pour, où vous pouvez mettre @DateTimeFormatet d'autres validations de formulaire comme @NotNull. Ensuite, vous devrez mapper l'objet movieDto à l'entité de film avant de persister.

whereami Nov 20 2020 at 13:04

Il s'avère que le problème était lié au nom de la colonne dans MySQL - release est un mot protégé et cause des problèmes avec la requête lorsqu'elle est utilisée. J'aurais dû le remarquer lorsque j'ai essayé de supprimer la colonne, car il ne remplissait pas automatiquement le nom comme il le fait pour les autres colonnes ...