试图用Joda DateTimes生成JooQ POJO,并且遇到了一些问题.POJO使用默认的java.sql.TimeStamp值而不是DateTimes来自生成器.
代码如下.
创建表 - 此处的时间戳字段的名称已更改 - 希望确保我没有在构建系统中的某个位置访问缓存.此名称仍应使用以下正则表达式进行匹配.
CREATE TABLE nonsense (
name VARCHAR(50) NOT NULL,
DATETIME_TEST TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
id UUID NOT NULL,
PRIMARY KEY(id)
);
Run Code Online (Sandbox Code Playgroud)
转换类 - 基于文档.
public class LocalDateTimeConverter implements Converter<Timestamp, LocalDateTime> {
@Override
public LocalDateTime from(Timestamp databaseObject) {
return new LocalDateTime(databaseObject.getTime());
}
@Override
public Timestamp to(LocalDateTime dt) {
return new Timestamp(dt.toDateTime().getMillis());
}
@Override
public Class<Timestamp> fromType() {
return Timestamp.class;
}
@Override
public Class<LocalDateTime> toType() {
return LocalDateTime.class;
}
}
Run Code Online (Sandbox Code Playgroud)
Jooq配置XML.基于文档(感谢抓住我的表达/表达错误卢克)!
<configuration>
<generator>
<database>
<customTypes>
<customType>
<name>org.joda.time.LocalDateTime</name>
<converter>n.b.jooqJodaTime.LocalDateTimeConverter</converter>
</customType>
</customTypes>
<forcedtypes>
<forcedType>
<name>org.joda.time.LocalDateTime</name>
<expressions>.*DATETIME.*</expressions>
</forcedType>
</forcedtypes>
</database>
</generator>
</configuration>
Run Code Online (Sandbox Code Playgroud)
创建POJO:
@javax.persistence.Column(name = "DATETIME_TEST", precision = 23, scale = 10)
public java.sql.Timestamp getDatetimeTest() {
return this.datetimeTest;
}
Run Code Online (Sandbox Code Playgroud)
对于历史背景,这是最初的问题.
创建表:
Run Code Online (Sandbox Code Playgroud)CREATE TABLE nonsense ( name VARCHAR(50) NOT NULL, TEST_DATETIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP, id UUID NOT NULL, PRIMARY KEY(id) );转换器:
Run Code Online (Sandbox Code Playgroud)package n.b.jooqJodaTime; import org.joda.time.DateTime; import org.jooq.Converter; import java.sql.Timestamp; public class DateTimeConverter implements Converter<Timestamp, DateTime> { @Override public DateTime from(Timestamp databaseObject) { return new DateTime(databaseObject.getTime()); } @Override public Timestamp to(DateTime dt) { return new Timestamp(dt.getMillis()); } @Override public Class<Timestamp> fromType() { return Timestamp.class; } @Override public Class<DateTime> toType() { return DateTime.class; } }Jooq配置:
Run Code Online (Sandbox Code Playgroud)<configuration> <jdbc> <url>jdbc:h2:file:build/database</url> <driver>org.h2.Driver</driver> <user>sa</user> </jdbc> <generator> <database> <name>org.jooq.util.h2.H2Database</name> <inputSchema>PUBLIC</inputSchema> <includes>.*</includes> <customTypes> <customType> <name>org.joda.time.DateTime</name> <converter>n.b.jooqJodaTime.DateTimeConverter</converter> </customType> </customTypes> <forcedtypes> <forcedType> <name>org.joda.time.DateTime</name> <expression>.*DATETIME.*</expression> </forcedType> </forcedtypes> </database> <generate> <pojos>true</pojos> <immutablePojos>true</immutablePojos> <jpaAnnotations>true</jpaAnnotations> <validationAnnotations>true</validationAnnotations> <deprecated>false</deprecated> </generate> <target> <packageName>n.b.c.generated.jooq</packageName> <directory>src/main/java/</directory> </target> </generator> </configuration>以下是结果:
Run Code Online (Sandbox Code Playgroud)/** * The column <code>PUBLIC.NONSENSE.TEST_DATETIME</code>. */ public final org.jooq.TableField<n.b.c.generated.jooq.tables.records.NonsenseRecord,java.sql.Timestamp> TEST_DATETIME = createField("TEST_DATETIME",org.jooq.impl.SQLDataType.TIMESTAMP,this);
我想这样看起来像这样:
Run Code Online (Sandbox Code Playgroud)/** * The column <code>PUBLIC.NONSENSE.TEST_DATETIME</code>. */ public final org.jooq.TableField<n.b.c.generated.jooq.tables.records.NonsenseRecord,org.joda.time.DateTime> TEST_DATETIME = createField("TEST_DATETIME",org.jooq.impl.SQLDataType.TIMESTAMP,this);
这可能是由于 XML 中的拼写错误造成的。(由于历史原因)该元素应该被称为<expressions/>not <expression/>:
<complexType name="ForcedType">
<all>
<!-- The name of the type to be forced upon various artefacts -->
<element name="name" type="string" minOccurs="1" maxOccurs="1" />
<!--
A Java regular expression matching columns, parameters, attributes,
etc to be forced to have this type
-->
<element name="expressions" type="string" minOccurs="1" maxOccurs="1" />
</all>
</complexType>
Run Code Online (Sandbox Code Playgroud)
另请参阅 XSD 了解详细信息。我认为在 jOOQ 3.3 中为两个元素名称创建同义词是值得的。现在注册为#2837
该元素还有另一个拼写错误<forcedtypes/>,应该是<forcedTypes/>!