繁体   English   中英

将 Postgres(和 AWS Redshift)数据库链接与 JOOQ 一起使用

[英]Using Postgres (and AWS Redshift) DB Link with JOOQ

我们正在尝试在 Postgres 和 AWS Redshift DB 之间建立数据库链接(这不是问题),但我们正在使用JOOQ来构建相同的数据库查询。

什么在起作用? 如果两个表在同一个数据库中,我们可以编写 JOIN SQL 查询我们想要获取的数据。 例如,如果我们有一个查询:

SELECT somefields
FROM dblink('global_database'::text, '
SELECT
    ... some data selected...) t1(username text, location int, createdAt timestamptz)
         JOIN user_meta t2 on "userId" = t1.userId
    AND createdAt between ... some date range ...
WHERE ...'
GROUP BY ...
ORDER BY ... DESC;

现在我们正在使用 JOOQ 构建查询:

Query query = dslContext
                .select(somefields))
                .from(table(TABLE))
                .rightJoin(TABLE_TWO).on(getJoinOnCondition())
                .where(whereCondition)
                .groupBy(groupByFields)
                .orderBy(orderByFields)
                .limit((int) pageRequest.getPageSize());

如何在 JOOQ Query 中建立 DB 链接?

分两步进行:

  • 分别为您的两个数据库生成代码。 使用<outputSchemaToDefault>true</outputSchemaToDefault>确保 Redshift 表没有与之关联的架构, 请参阅手册
  • 每当您使用 dblink 时,当您将 Redshift 表放在FROM子句中时,将其包装在一个普通的 SQL 模板中,否则使用生成的 class ,例如使用以下实用程序:
static Table<?> dblink(String conn, Table<?> table, Field<?>... fields) {
    return table("dblink({0}, {1}) as {2}({3})",
        inline(conn),
        inline(DSL.using(POSTGRES).render(select(fields).from(table))),
        table.getUnqualifiedName(),
        list(
            Stream.of(fields)
                  .map(f -> DSL.sql("{0} {1}",
                       f.getUnqualifiedName(),
                       sql(f.getDataType().getCastTypeName())
                  ))
                  .toArray(QueryPart[]::new)
        )
    );
}

暗示了通常的 static 导入:

import static org.jooq.impl.DSL.*;

然后像这样使用这个实用程序:

Query query = dslContext
                .select(somefields))
                .from(dblink("global_database", TABLE, TABLE.fields()))
                .rightJoin(TABLE_TWO).on(getJoinOnCondition())
                // You can now use TABLE as if it were a local table
                .where(whereCondition)
                .groupBy(groupByFields)
                .orderBy(orderByFields)
                .limit((int) pageRequest.getPageSize());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM