【问题标题】:Generate Dynamic Query using JOOQ使用 JOOQ 生成动态查询
【发布时间】:2021-08-23 23:06:15
【问题描述】:

我想生成一个 SQL 查询,其中表名存储在表数组中。 以及存储在二维数组中的相应列名。

例子:-

Tables array
[T1,T2,T3]
Columns array
[
    [C1,C2],   // T1 columns
    [C1,C2],   // T2 columns
    [C1,C2]    // T3 columns
]

QUERY:-
select T1.C1,T2.C1,T3.C1 from T1
inner join T2 ON T2.C2=T1.C2;
inner join T3 ON T3.C2=T1.C2

select first column of every table in the array 
if they have a match in the second column

[assuming every table has 2 columns]

我不想执行这个查询。 我只想使用 JOOQ 打印它。 有人可以帮我解决这个问题。

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    您问题的措辞提供了一些解释的空间。我假设你有这些特定的数组类型:

    Table<?>[] tables = ...
    Field<?>[][] fields = ...
    

    我假设您的要求是通过通用列名(即与第一个表的第二列的名称相同的名称)匹配 所有 表,以便加入他们。由于您没有指定如果连续表没有这样的匹配会发生什么,我假设您希望默认排除这些表及其列。

    无论如何,我想这更像是一个关于如何做dynamic SQL with jOOQ in general 的想法的问题,而不一定是如何解决您的特定问题

    在这种情况下,写:

    Field<?> match = fields[0][1];
    
    List<Field<?>> select = new ArrayList<>();
    Table<?> from = tables[0];
    
    select.add(fields[0][0]);
    for (int i = 1; i < fields.length && i < tables.length; i++) {
        if (match.getName().equals(fields[i][1].getName())) {
            select.add(fields[i][0]);
            from = from.join(tables[i]).on(match.eq((Field) fields[i][1]));
        }
    }
    
    ctx.select(select)
       .from(from)
       .fetch();
    

    如果您的实际要求与这些假设有很大不同,您仍然可以提出新问题。

    【讨论】:

      猜你喜欢
      • 2012-12-12
      • 2018-10-05
      • 2017-09-02
      • 1970-01-01
      • 2017-11-11
      • 1970-01-01
      • 2018-08-02
      • 2021-04-12
      • 2023-01-14
      相关资源
      最近更新 更多