Jooq binding for “timestamp with time zone” type in postgres

匿名 (未验证) 提交于 2019-12-03 01:39:01

问题:

Jooq currently does not support JSR 310 types and support will not come until v3.8.

Using simple converters generally works, except for certain types, such as postgres' TIMESTAMP WITH TIME ZONE, which requires a custom binding. So I have tried to write one but the generated XxxRecord classes still use a Timestamp data type for the TIMESTAMP WITH TIME ZONE fields in my DB.

What do I need to change in my code below to see postgres' TIMESTAMP WITH TIME ZONE as an Instantin jooq's generated classes?

Converter

public class TimestampConverter implements Converter<Timestamp, Instant> {   @Override public Instant from(Timestamp ts) {     return ts == null ? null : ts.toInstant();   }   @Override public Timestamp to(Instant instant) {     return instant == null ? null : Timestamp.from(instant);   }   @Override public Class<Timestamp> fromType() { return Timestamp.class; }   @Override public Class<Instant> toType() { return Instant.class; } }

Custom binding

public class TimestampBinding implements Binding<Timestamp, Instant> {    private static final Converter<Timestamp, Instant> converter = new TimestampConverter();    private final DefaultBinding<Timestamp, Instant> delegate =                                                         new DefaultBinding<> (converter());    @Override public Converter<Timestamp, Instant> converter() { return converter; }    @Override public void sql(BindingSQLContext<Instant> ctx) throws SQLException {     delegate.sql(ctx);   }    //etc. same for all other overriden methods. }

pom.xml (extracts)

<customType>   <name>java.time.Instant</name>   <type>java.time.Instant</type>   <binding>xxx.TimestampBinding</binding> </customType>  ...  <forcedType>   <name>java.time.Instant</name>   <types>timestamp with time zone</types> </forcedType>

回答1:

One way would be to escape the spaces in <types> with backslashes, as follows:

<types>timestamp\ with\ time\ zone</types>

You can't just have regular spaces in <types> because by default, org.jooq.util.AbstractDatabase will parse regular expressions in COMMENTS mode which makes the created Pattern object ignore whitespace in your regex. You could also do something like <types>timestamp.*zone</types>, or specify your own <regexFlags>.

The following is the full Maven jooq-codegen-maven plugin tag that works for me. I also found the <binding> to be unnecessary.

<plugin>     <groupId>org.jooq</groupId>     <artifactId>jooq-codegen-maven</artifactId>     <version>3.7.0</version>      <executions>         <execution>             <goals>                 <goal>generate</goal>             </goals>         </execution>     </executions>      <configuration>          <jdbc>             <driver>org.postgresql.Driver</driver>             <url>jdbc:postgresql:postgres</url>             <user>postgres</user>             <password>mypass</password>         </jdbc>          <generator>             <database>                 <customTypes>                     <customType>                         <name>Instant</name>                         <type>java.time.Instant</type>                         <converter>xxx.TimestampConverter</converter>                     </customType>                 </customTypes>                  <forcedTypes>                     <forcedType>                         <name>Instant</name>                         <types>timestamp\ with\ time\ zone</types>                     </forcedType>                 </forcedTypes>                  <name>org.jooq.util.postgres.PostgresDatabase</name>                 <includes>author</includes>                 <excludes/>                 <inputSchema>public</inputSchema>             </database>             <target>                 <packageName>xxx.table</packageName>                 <directory>target/generated-sources/jooq</directory>             </target>         </generator>     </configuration> </plugin>


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!