簡體   English   中英

JOOQ強制類型代碼生成

[英]JOOQ forced type code generation

我在使用強制類型生成代碼時遇到了一些問題(JOOQ 3.3,Postgres 9.3)。

試圖將sql時間戳轉換為joda DateTime,導致我編譯錯誤。

我的桌子:

CREATE TABLE book
(
  // [...]
  date_published timestamp without time zone,
  // [...]
);

和我的.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>
// [...]

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;
    }
}

所以,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());

這導致編譯錯誤:

Type mismatch: cannot convert from TableField<BookRecord,DateTime> to TableField<BookRecord,Timestamp>.

我知道我可以將DATE_PUBLISHED類型更改為DATE_PUBLISHED TableField<BookRecord,DateTime>並重構代碼,但我不想手動修補生成的類。

我有什么想法,我做錯了什么?

<customType/><name/>元素應該引用Converter<T, U><U>類型(用戶類型),而不是<T>類型(數據庫類型)。 所以,如果你這樣寫:

<customTypes>
  <customType>
   <name>java.sql.Timestamp</name>
   <converter>com.plannow.jooq.converters.DateTimeConverter</converter>
  </customType>         
</customTypes>

然后你真的只是注冊一個Converter<Timestamp, Timestamp> 試試這個:

<customTypes>
  <customType>
   <name>org.joda.time.DateTime</name>
   <converter>com.plannow.jooq.converters.DateTimeConverter</converter>
  </customType>         
</customTypes>

請注意,您的轉換器也應正確處理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());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM