从 SelectQuery(或等效项)中提取查询部分?
Extract query parts from a SelectQuery (or equivalents)?
我有以下情况:
ClassA extends B
。其他类,如C
,D
等也扩展B
在Class B
,我想把逻辑放在A
、C
和 D
.
共有的一般信息
因此,我想在 B
中进行一般查询以检索所有一般信息,但也能够将 Query
传递给 B
,以便正确的 join
s 和 condition
s 已满足。基本上:
public B getB(String bUuid, Query extendedQuery) {
SelectQuery bQuery = ... dsl.select(/* general B columns */)
.select(/* SELECT part from extended query */)
.from(/* general B tables */)
.from(/* FROM part from extended query */) // maybe join with some if else logic instead
.where(/* general B conditions */)
.where(/* WHERE part of extended query */)
这可以使用 JOOQ 吗?除非绝对必要,否则我真的不想使用普通 SQL 执行。
编辑:
使用下面的答案,这是我非常满意的最终代码:
public Record getB(String bUuid, Consumer<SelectQuery> extender)
我这样称呼:
Record r = B.getB(uuid, query -> {
query.addSelect(...);
query.addJoin(...);
}
并且在 getB 中,在生成 "general" SelectQuery query
之后,我们只需调用:
extender.apply(query);
之后我们可以简单地使用我们的增强查询query.fetchOne()
。
考虑函数式,而不是面向对象!这将是一个更简单的方法:
public B getB(
String bUuid,
Supplier<? extends Collection<? extends Field<?>>> select,
Supplier<? extends Collection<? extends Table<?>>> from,
Supplier<? extends Collection<? extends Condition>> where
) {
List<Field<?>> allSelect = new ArrayList<>();
allSelect.addAll(/* general B columns */);
allSelect.addAll(select.get());
List<Table<?>> allFrom = new ArrayList<>();
allFrom.addAll(/* general B tables */);
allFrom.addAll(from.get());
List<Table<?>> allWhere = new ArrayList<>();
allWhere.addAll(/* general B conditions*/);
allWhere.addAll(where.get());
dsl.select(allSelect)
.from(allFrom)
.where(allWhere);
}
现在,您可以像这样调用这个高阶函数:
getB(
uuid,
() -> Arrays.asList(A.COL1, A.COL2, A.COL3),
() -> Arrays.asList(A),
() -> Arrays.asList(A.B_ID.eq(B.ID), A.COL4.like("%ABC%"))
);
我有以下情况:
ClassA extends B
。其他类,如C
,D
等也扩展B
在Class B
,我想把逻辑放在A
、C
和 D
.
因此,我想在 B
中进行一般查询以检索所有一般信息,但也能够将 Query
传递给 B
,以便正确的 join
s 和 condition
s 已满足。基本上:
public B getB(String bUuid, Query extendedQuery) {
SelectQuery bQuery = ... dsl.select(/* general B columns */)
.select(/* SELECT part from extended query */)
.from(/* general B tables */)
.from(/* FROM part from extended query */) // maybe join with some if else logic instead
.where(/* general B conditions */)
.where(/* WHERE part of extended query */)
这可以使用 JOOQ 吗?除非绝对必要,否则我真的不想使用普通 SQL 执行。
编辑:
使用下面的答案,这是我非常满意的最终代码:
public Record getB(String bUuid, Consumer<SelectQuery> extender)
我这样称呼:
Record r = B.getB(uuid, query -> {
query.addSelect(...);
query.addJoin(...);
}
并且在 getB 中,在生成 "general" SelectQuery query
之后,我们只需调用:
extender.apply(query);
之后我们可以简单地使用我们的增强查询query.fetchOne()
。
考虑函数式,而不是面向对象!这将是一个更简单的方法:
public B getB(
String bUuid,
Supplier<? extends Collection<? extends Field<?>>> select,
Supplier<? extends Collection<? extends Table<?>>> from,
Supplier<? extends Collection<? extends Condition>> where
) {
List<Field<?>> allSelect = new ArrayList<>();
allSelect.addAll(/* general B columns */);
allSelect.addAll(select.get());
List<Table<?>> allFrom = new ArrayList<>();
allFrom.addAll(/* general B tables */);
allFrom.addAll(from.get());
List<Table<?>> allWhere = new ArrayList<>();
allWhere.addAll(/* general B conditions*/);
allWhere.addAll(where.get());
dsl.select(allSelect)
.from(allFrom)
.where(allWhere);
}
现在,您可以像这样调用这个高阶函数:
getB(
uuid,
() -> Arrays.asList(A.COL1, A.COL2, A.COL3),
() -> Arrays.asList(A),
() -> Arrays.asList(A.B_ID.eq(B.ID), A.COL4.like("%ABC%"))
);