2017-09-05 75 views
1

PostgresQL INSERTs允許使用插入列的任何子集返回output_expression,但我無法獲得與jOOQ一起使用此功能的語法。插入...使用output_expression返回

這是PL/pgSQL的等價物是什麼我想要實現:

CREATE TABLE my_table (i INTEGER, t TEXT); 

DO 
    $$DECLARE my_var TEXT; 
BEGIN 
    INSERT INTO my_table(i, t) 
     VALUES(1, 'hello') 
     RETURNING (t) INTO my_var; 

    RAISE NOTICE 'Inserted text was --> % <--', my_var; 
END$$; 

但我發現這個問題是這樣的語法無效在jOOQ:

String retVal = using(configuration) 
    .insertInto(MY_TABLE, 
     MY_TABLE.I, 
     MY_TABLE.T) 
    .values(i, t) 
    .returning(MY_TABLE.T) 
    .fetchInto(String.class); 

我已經最接近一直在使用fetchOne得到一個完整的MyTableRecord和挑選我想要的領域。有沒有另一種方法告訴JOOQ準確地獲取我想要的變量類型?

PD:我使用jOOQ 3.9.2

+0

這是在路線圖上:https://github.com/jOOQ/jOOQ/issues/3185 –

回答

0

您可以使用.fetch().into(String.class)

+0

'fetch()。into()'返回'List '而不是'String',所以它不能編譯。但即使我改變了'retVal'的類型來編譯,我得到這個錯誤:'org.jooq.exception.MappingException:不能映射度數2的多列記錄到值類型類java.lang.String'。請注意,'fetch()'返回一個'MyTableRecord'而不是'Record1',所以如果沒有額外的幫助,它不能被映射到'String'。 – MondKin

0

我已經找到解決方法如下,它利用Java的Optional的:

String retVal = using(configuration) 
    .insertInto(MY_TABLE, 
     MY_TABLE.I, 
     MY_TABLE.T) 
    .values(i, t) 
    .returning() 
    .fetchOptional() 
    .map(MyTableRecord::getT) 
    .orElse(null);