尝试保存到MySQL日期时出现JpaRepository SQL语法错误



我的MySQL表中有以下行:

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

此列表示为:

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

它与百里香的形式结合在一起,就像这样:

<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数据库中插入一个日期,则会加载该日期并将其设置为表单上的正确日期:https://i.stack.imgur.com/e35lr.png但每次我试图保存或编辑电影时,我都会收到以下错误:

java.sql.SQLSyntaxErrorException:您的sql语法中有一个错误;在第1行的release='2016-05-19',title='TheShawshankRedemption',user_name='usan'where'附近,查看与MySQL服务器版本对应的手册,以获得正确的语法

即使我将发布日期设置为空,Hibernate也不会保存电影。如果我完全删除了日期的@Column并将其从Thymelaf表单中删除,则对象将正确保存,不会出现错误。因为JpaRepository正在生成所有的查询,所以我看不出语法怎么会出错。我也尝试过使用标准java.util.Date作为具有相同问题的类型。

编辑:删除@DateTimeFormat会出现以下错误:

[无法将类型为"java.lang.String"的属性值转换为属性"movie.release"所需的类型"java.time.LocalDate"]

使用Spring Boot 2.3.5.RELEASE

问题出在MySQL中-版本是一个受保护的单词,使用时会导致查询问题。当我尝试删除该列时应该注意到,因为它不会像其他列那样自动填充名称。。。

根据您的反馈,远程处理@DateTimeFormat解决了数据库映射的问题,所以这是第一件事。

接下来,我建议将用于表单的数据传输对象与实际实体分离。从长远来看,这将有很大帮助。因此,您有一个用于表单绑定的MovieDTO,您可以在其中放置@DateTimeFormat和其他表单验证,如@NotNull。然后,在持久化之前,您需要将movieTo对象映射到movie实体。

最新更新