2013-01-02 101 views
2

我有一個MySQL表中有一些列(MD5,FLAGCONFIRMED,FLAGCHANGEPASSWORD)定義像「char(1)」,其中唯一可能的值是0和1.我想要jOOQ將它們轉換爲布爾值在代碼生成中。jOOQ轉換字符串布爾

我創建了一個轉換器:

public class BooleanConverter implements org.jooq.Converter<String, Boolean>{ 

    private static final long serialVersionUID = -4785961538634851898L; 

    @Override 
    public Boolean from(String arg0) { 
     if (arg0 == null) { 
     return null; 
     } 
     return arg0.equals("1"); 
    } 

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

    @Override 
    public String to(Boolean arg0) { 
     if (arg0 == null) { 
     return null; 
     } 
     return arg0.booleanValue() ? "1" : "0"; 
    } 

    @Override 
    public Class<Boolean> toType() { 
     return Boolean.class; 
    } 

} 

然後我在POM配置的轉換器(我使用Maven來生成源)。

<customTypes> 
    <customType> 
    <name>java.lang.Boolean</name> 
    <converter>org.test.converter.BooleanConverter</converter> 
    </customType> 
</customTypes> 

<forcedTypes> 
    <forcedType> 
    <name>java.lang.Boolean</name> 
    <expressions>.*\.FLAGCHANGEPASSWORD,.*\.FLAGCONFIRMED,.*\.MD5.*</expressions> 
    </forcedType> 
</forcedTypes> 

代碼已成功生成但類型未轉換,它們的類型仍爲字符串。

/** 
* The table column <code>mmw.enduser.MD5</code> 
*/ 
public final org.jooq.TableField<de.kybeidos.mmw.data.tables.records.EnduserRecord, java.lang.String> MD5 = createField("MD5", org.jooq.impl.SQLDataType.CHAR, this); 

如何讓它工作?

編輯:我使用jOOQ 2.6.1

+0

你有沒有嘗試使用**'java.lang.Character' **作爲轉換器的** ** fromType? (而不是字符串) – lschin

+0

lschin,它不起作用。 – islon

回答

4

這似乎是在jOOQ,代碼生成的錯誤。雖然文檔中明確指出,可以提供幾個正則表達式...

<forcedTypes> 
    <forcedType> 
    <!-- Specify again he fully-qualified class name of your custom type --> 
    <name>java.util.GregorianCalendar</name> 

    <!-- Add a list of comma-separated regular expressions matching columns --> 
    <expressions>.*\.DATE_OF_.*</expressions> 
    </forcedType> 
</forcedTypes> 


http://www.jooq.org/doc/2.6/manual/code-generation/custom-data-types/

兩者...源代碼實際上解釋<expressions/>內容作爲單個正則表達式。嘗試以下,相反,通過配管替換逗號:

<expressions>.*\.FLAGCHANGEPASSWORD|.*\.FLAGCONFIRMED|.*\.MD5.*</expressions> 

事實上,逗號不應被用於分離的正則表達式逗號可以具有正則表達式的語義如{a, b}或用戶輸入的語義。我已經提交#2076修復在jOOQ 2.7,3.0

請注意,您不必爲自定義轉換器編寫布爾值。您可以強制BOOLEAN JDBC類型到您的列是這樣的:

<forcedTypes> 
    <forcedType> 
    <name>BOOLEAN</name> 
    <expressions>.*\.FLAGCHANGEPASSWORD|.*\.FLAGCONFIRMED|.*\.MD5.*</expressions> 
    </forcedType> 
</forcedTypes> 
+0

感謝盧卡斯,它的工作原理。即使我的字段是char(1),這個JDBC BOOLEAN類型是否工作? – islon

+0

@islon:是的,它只是強制jOOQ對該列的'DataType'引用變爲'SQLDataType.BOOLEAN'。然後,JDBC可以通過像'PreparedStatement.setBoolean(int,boolean)'或'ResultSet.getBoolean(int)'這樣的JDBC API方法正確地處理布爾值。如果您發現該區域內某些工作不正常,請隨時向[用戶組](https://www.google.ch/search?q=jooq-user)或[GitHub](https:/ /github.com/jOOQ/jOOQ) –