2016-04-20 63 views
2

感覺就像我很接近,但我無法弄清楚在jOOq中如何做下面的事情。jOOq MERGE在Oracle中

MERGE INTO USER_ASSIGNMENTS ua 
USING (
      SELECT core_object_id 
      FROM core_objects 
      WHERE exists(SELECT * 
         FROM LKU_CODE lc JOIN LKU_CODE_TYPE lct 
           ON lc.LKU_CODE_TYPE_ID = lct.LKU_CODE_TYPE_ID AND lct.CODE_TYPE = 'OBJECT_TYPE' AND 
            lc.CODE = 'PORTFOLIOS' 
         WHERE lc.LKU_CODE_ID = core_objects.OBJECT_TYPE_ID) AND object_id = 83 
    ) "co" 
ON (ua.CORE_OBJECT_ID = "co".CORE_OBJECT_ID AND USER_ID = 24 AND SECTION = 1) 
WHEN MATCHED THEN UPDATE 
SET create_date = sysdate, created_by = '24', capabilities = 12 
    WHERE capabilities <> 12 
WHEN NOT MATCHED THEN INSERT 
    (CAPABILITIES, CORE_OBJECT_ID, CREATE_DATE, CREATED_BY, SECTION, USER_ID) 
VALUES (5, "co".CORE_OBJECT_ID, sysdate, '24', 1, 24); 

最重要的事情要注意的是,我試圖用通過返回的值,所以我不得不別名它.values()有權接受現場電話。我想我可以使用.values(Collection<?>)調用解決.values()問題,將包括該字段在內的東西捆綁到一個集合中,所以我認爲我有這個部分。我擔心的是,我不能在.using()之後撥打.as()。如果我讓USING通過.asTable()查詢一個「表」,提供一個別名,是否可以讓我打電話給該字段?下面是種什麼我都不得不時刻:

Table<Record1<BigDecimal>> usingStatement = readContext 
     .select(_co.CORE_OBJECT_ID) 
     .from(_co) 
     .where(DSL.exists(readContext.select(_lc.fields()).from(
       _lc.join(_lct).onKey(Keys.LC_LCT___FK) 
         .and(_lc.CODE.equal(capability.getObjectTypeCode())) 
         .and(_lct.CODE_TYPE.equal(LkuCodeTypeLookup.OBJECT_TYPE))))).asTable("sdf"); 
... 

return writeContext 
        .mergeInto(_ua) 
        .using(usingStatement) 
        .on(sectionalConditions.and(_ua.CORE_OBJECT_ID.equal(coidField))) 
        .whenMatchedThenUpdate() 
        .set(_ua.CREATE_DATE, time) 
        .set(_ua.CREATED_BY, creator) 
        .set(_ua.CAPABILITIES, capabilities) 
        .where(_ua.CAPABILITIES.notEqual(capabilities)) 
        .whenNotMatchedThenInsert(_ua.CAPABILITIES, _ua.CORE_OBJECT_ID, _ua.CREATE_DATE, 
          _ua.CREATED_BY, _ua.SECTION, _ua.USER_ID) 
        .values(capabilities, gcoid, time, creator, section, uuid).execute(); 

「直合併」使用雙是jOOq簡單,但我想嘗試結合該選擇到合併以保存查詢,讓DB做它最擅長的事情,所以我儘量不必在另一個查詢中獲取core_object_id。

回答

2

混疊確實發生在表格上(即select),而不是由USING子句返回的某些人爲現象。至少,這就是jOOQ的模型。您已經正確替換了您的usingStatement變量。現在,所有你需要做的就是廢棄從中

usingStatement.field(_co.CORE_OBJECT_ID); 

這將尋找在usingStatement表命名CORE_OBJECT_ID列所需的列,例如:。

+0

令人敬畏!謝謝! – DanO

+1

(那個解引用作品是我不知道我可以做的新金塊 - 我可以用它來代替那個瘋狂的double field在我的其他帖子中;非常感謝你的幫助和工具!) – DanO

+0

@DanO:你非常歡迎! :) –