使用 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 = ...
我假设您的要求是通过公共列名称(即与第二列名称相同的名称)匹配 all tables第一个 table),以便加入他们。由于您没有指定如果连续的 table 没有这样的匹配项会发生什么,我假设您希望默认排除此类 table 及其列。
无论如何,我想这更多的是关于如何做 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();
如果您的实际需求与这些假设有很大的不同,您仍然可以提出新的问题。
我想生成一个 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 = ...
我假设您的要求是通过公共列名称(即与第二列名称相同的名称)匹配 all tables第一个 table),以便加入他们。由于您没有指定如果连续的 table 没有这样的匹配项会发生什么,我假设您希望默认排除此类 table 及其列。
无论如何,我想这更多的是关于如何做 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();
如果您的实际需求与这些假设有很大的不同,您仍然可以提出新的问题。