JOOQ强制类型代码生成

use*_*799 4 java postgresql type-conversion jooq

我在使用强制类型(JOOQ 3.3,Postgres 9.3)生成代码时遇到一些问题。

尝试将sql时间戳转换为joda DateTime,导致编译错误。

我的桌子:

CREATE TABLE book
(
  // [...]
  date_published timestamp without time zone,
  // [...]
);
Run Code Online (Sandbox Code Playgroud)

和我的.xml配置:

// [...]
<customTypes>
  <customType>
   <name>java.sql.Timestamp</name>
   <converter>com.plannow.jooq.converters.DateTimeConverter</converter>
  </customType>         
</customTypes>
<forcedTypes>
  <forcedType>
   <name>java.sql.Timestamp</name>
   <expression>.*\.date_.*</expression>
   <types>.*</types>
  </forcedType>
</forcedTypes>
// [...]
Run Code Online (Sandbox Code Playgroud)

DateTimeConverter类:

public class DateTimeConverter implements Converter<Timestamp, DateTime>
{

    @Override
    public DateTime from(Timestamp databaseObject)
    {
        return new DateTime(databaseObject);
    }

    @Override
    public Timestamp to(DateTime userObject)
    {
        return new Timestamp(userObject.getMillis());
    }

    @Override
    public Class<Timestamp> fromType()
    {
        return Timestamp.class;
    }

    @Override
    public Class<DateTime> toType()
    {
        return DateTime.class;
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,BOOK.DATE_PUBLISHED的生成方式如下:

public final org.jooq.TableField<com.plannow.jooq.db.tables.records.BookRecord, java.sql.Timestamp> DATE_PUBLISHED = createField("date_published", org.jooq.impl.SQLDataType.TIMESTAMP, this, "", new com.plannow.jooq.converters.DateTimeConverter());
Run Code Online (Sandbox Code Playgroud)

导致编译错误:

Type mismatch: cannot convert from TableField<BookRecord,DateTime> to TableField<BookRecord,Timestamp>.
Run Code Online (Sandbox Code Playgroud)

我知道我可以改变的类型DATE_PUBLISHEDTableField<BookRecord,DateTime>和重构代码,但我不想手动补丁生成的类。

任何想法我在做什么错?

Luk*_*der 5

<name/>您的元素<customType/>应引用您的<U>类型(用户类型)Converter<T, U>,而不是<T>类型(数据库类型)。所以,如果你这样写:

<customTypes>
  <customType>
   <name>java.sql.Timestamp</name>
   <converter>com.plannow.jooq.converters.DateTimeConverter</converter>
  </customType>         
</customTypes>
Run Code Online (Sandbox Code Playgroud)

那么您实际上只是在注册一个Converter<Timestamp, Timestamp>。尝试以下方法:

<customTypes>
  <customType>
   <name>org.joda.time.DateTime</name>
   <converter>com.plannow.jooq.converters.DateTimeConverter</converter>
  </customType>         
</customTypes>
Run Code Online (Sandbox Code Playgroud)

请注意,您的转换器还应该正确处理null值:

@Override
public DateTime from(Timestamp t)     {
    return t == null ? null : new DateTime(t);
}

@Override
public Timestamp to(DateTime u) {
    return u == null ? null : new Timestamp(u.getMillis());
}
Run Code Online (Sandbox Code Playgroud)