坚持与Kotlin和SpringBoot LocalDate

我正在用SpringBoot和JPA尝试Kotlin。 我试图坚持一个LocalDate但有一个错误。 以下是我的实体的cody:

@Entity @Table(name = "season") data class Season(val name: String, @Convert(converter = LocalDateAttributeConverter::class) val from: LocalDate, @Convert(converter = LocalDateAttributeConverter::class) val to: LocalDate, @Enumerated(EnumType.STRING) val status: Status, @Id @GeneratedValue val id: Int = -1) enum class Status { CURRENT, CLOSED } 

转换器:

 @Converter(autoApply = true) class LocalDateAttributeConverter : AttributeConverter { override fun convertToDatabaseColumn(locDate: LocalDate?): Date? { return if (locDate == null) null else Date.valueOf(locDate) } override fun convertToEntityAttribute(sqlDate: Date?): LocalDate? { return sqlDate?.toLocalDate() } } 

当我尝试创建实体时:

 val season = seasonRepository.save(Season("2017-2018", LocalDate.of(2017, Month.SEPTEMBER, 1), LocalDate.of(2018, Month.JULY, 31), Status.CURRENT)) 

错误堆栈如下:

由于:org.h2.jdbc.JdbcSQLException:SQL语句中的语法错误“SELECT SEASON0_.ID AS ID1_6_0_,SEASON0_.FROM [*] AS FROM2_6_0_,SEASON0_.NAME AS NAME3_6_0_,SEASON0_.STATUS AS STATUS4_6_0_ FROM SEASON SEASON0_ WHERE SEASON0_。 ID =?“; 预期的“标识符”; SQL语句:select season0_.id as id1_6_0_,season0_.from as2_6_0_,season0_.name as name3_6_0_,season0_.status as status4_6_0_ from season season0_ where season0_.id =? [42001-195] at org.h2.message.DbException.getJavacSQLException(DbException.java:345)〜[h2-1.4.195.jar:1.4.195] at org.h2.message.DbException.getSyntaxError(DbException.java :205)〜[h2-1.4.195.jar:1.4.195] at org.h2.command.Parser.readColumnIdentifier(Parser.java:3241)〜[h2-1.4.195.jar:1.4.195] at org .h2.command.Parser.readTermObjectDot(Parser.java:2737)〜[h2-1.4.195.jar:1.4.195] at org.h2.command.Parser.readTerm(Parser.java:2863)〜[h2- org.h2.command.Parser.readFactor(Parser.java:2384)〜[h2-1.4.195.jar:1.4.195] at org.h2.command.Parser。 readSum(Parser.java:2371)〜[h2-1.4.195.jar:1.4.195] at org.h2.command.Parser.readConcat(Parser.java:2341)〜[h2-1.4.195.jar:1.4 .195]在org.h2.command.Parser.readAnd(Parser.java:2144)上的org.h2.command.Parser.readCondition(Parser.java:2172)〜[h2-1.4.195.jar:1.4.195] )〜[h2-1.4.195.jar:1.4.195] at org.h2.command.Parser.readExpression(Parser.java:2136)〜[h2-1.4.195.jar:1.4.195] at org.h2 .command.Parser.parseSelectSimpleSelectPart(Parser.j ava:2047)〜[h2-1.4.195.jar:1.4.195] at org.h2.command.Parser.parseSelectSimple(Parser.java:2079)〜[h2-1.4.195.jar:1.4.195] at org.h2.command.Parser.parseSelectSub(Parser.java:1934)〜[h2-1.4.195.jar:1.4.195] at org.h2.command.Parser.parseSelectUnion(Parser.java:1749)〜[h2 -1.4.195.jar:1.4.195]在org.h2.command.Parser.parseSelect(Parser.java:1737)〜[h2-1.4.195.jar:1.4.195] at org.h2.command.Parser .parsePrepared(Parser.java:448)〜[h2-1.4.195.jar:1.4.195] at org.h2.command.Parser.parse(Parser.java:320)〜[h2-1.4.195.jar: org.h2.command.Parser.prepareCommand(Parser.java:1.4.195)at org.h2.command.Parser.parse(Parser.java:292)〜[h2-1.4.195.jar:1.4.195] 257)〜[h2-1.4.195.jar:1.4.195] at org.h2.engine.Session.prepareLocal(Session.java:573)〜[h2-1.4.195.jar:1.4.195] at org。 h2.engine.Session.prepareCommand(Session.java:514)〜[h2-1.4.195.jar:1.4.195] at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1204)〜[h2-1.4 .195.jar:1.4.195] at org.h2.jdbc.JdbcPreparedStatement。(JdbcPrepared Statement.java:73)〜[h2-1.4.195.jar:1.4.195] at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:288)〜[h2-1.4.195.jar:1.4.195 ] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)〜[na:1.8.0_151] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)〜[na:1.8.0_151] at sun.reflect.DelegatingMethodAccessorImpl .invoke(DelegatingMethodAccessorImpl.java:43)〜[na:1.8.0_151] at org.apache.tomcat.jdbc java.lang.reflect.Method.invoke(Method.java:498)〜[na:1.8.0_151] .pool.ProxyConnection.invoke(ProxyConnection.java:126)〜[tomcat-jdbc-8.5.15.jar:na] at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:108)〜[ tomcat-jdbc-8.5.15.jar:na] at org.apache.tomcat.jdbc.pool.interceptor.AbstractCreateStatementInterceptor.invoke(AbstractCreateStatementInterceptor.java:75)〜[tomcat-jdbc-8.5.15.jar:na] at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:108)〜[tomcat-jdbc-8.5.15.jar:na] at org.apache.tomcat.jd bc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:81)〜[tomcat-jdbc-8.5.15.jar:na] at com.sun.proxy。$ Proxy66.prepareStatement(Unknown Source)〜[na:na] at org.hibernate.engine.jdbc.internal.StatementPreparerImpl $ 5.doPrepare(StatementPreparerImpl.java:146)〜[hibernate-core-5.0.12.Final.jar:5.0.12.Final] at org.hibernate.engine.jdbc。 internal.StatementPreparerImpl $ StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172)〜[hibernate-core-5.0.12.Final.jar:5.0.12.Final] …省略了67个常用框架

有没有人遇到同样的问题?

先谢了,罗曼。

错误的重要部分是:

预期的“标识符”; SQL语句:选择season0_.id作为id1_6_0_,season0_.from作为from2_6_0_,(… snip …)

SQL在某些时候期待一个标识符,但是找不到它。 关键字from是列名应该是的位置:这就是问题所在。

你可以重命名你from属性,或者告诉JPA你想在SQL中调用其他东西,像这样:

 @Column(name = "date_from") @Convert(converter = LocalDateAttributeConverter::class) val from: LocalDate,