java - Oracle 中的 jOOq MERGE

标签 java sql jooq

感觉我已经很接近了,但我不知道如何在 jOOq 中做如下的事情。

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

需要注意的重要一点是,我正在尝试使用 USING 返回的值,因此我必须为它起别名 .values()必须接受现场调用。我想我可以绕过 .values()使用 .values(Collection<?>) 的问题调用,将事物(包括该字段)捆绑到一个集合中,所以我认为我拥有该部分。我担心的是我不能做 .as()调用 .using() 。如果我做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();

使用 Dual 的“直接合并”在 jOOq 中很简单,但我想尝试将选择合并到合并中以保存查询并让数据库做它最擅长的事情,所以我试图不这样做如果可能的话,在另一个查询中获取 core_object_id。

最佳答案

别名确实发生在表(即选择)上,而不是发生在 USING 子句返回的某些工件上。至少,jOOQ 是这么建模的。您已经正确地为 usingStatement 变量设置了别名。现在您所要做的就是从中取消引用所需的列,例如:

usingStatement.field(_co.CORE_OBJECT_ID);

这将在 usingStatement 表中查找名为 CORE_OBJECT_ID 的列。

关于java - Oracle 中的 jOOq MERGE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36755663/

相关文章:

java - 更新叠加层时发生 MapView ConcurrentModificationException

python - 有没有办法根据特定单元格的值选择不同的东西?

mysql - 将更新从 mysql 转换为 oracle

java - 枚举的设计建议

java - 如何使用多态性在运行时根据实例加载 fragment ?

java - 如何使用 Jooq 中的其他自定义(concat,sum,count)列从数据库中获取所有结果列

java - 如何在 JOOQ 中设置一个@Variable

java - 使用 jooq dsl 插入超过 22 个字段

java - 在 IntelliJ 中编辑运行时类路径以包含 src/main/config

MySQL 从 AS 中删除