簡體   English   中英

使用 JOOQ 生成動態查詢

[英]Generate Dynamic Query using JOOQ

我想生成一個 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 打印它。 有人可以幫我解決這個問題。

您的問題的措辭為一些解釋提供了空間。 我假設你有這些特定的數組類型:

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

我假設您的要求是通過公共列名(即與第一個表的第二列的名稱相同的名稱)匹配所有表,以便加入它們。 由於您沒有指定如果連續表沒有這樣的匹配會發生什么,我假設您希望默認排除此類表及其列。

無論如何,我想這更多的是關於如何使用 jOOQ 進行動態SQL的想法的問題,不一定是如何解決您的特定問題

在這種情況下,寫:

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

如果您的實際要求與這些假設有很大不同,您仍然可以提出一個新問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM