假设我有一个查询构建器
ResultQuery query = DSL.select().from(TABLE);
和连接/上下文池
DSLContext ctx = DSL.using(conn, SQLDialect.MYSQL)
我希望能够:
由于jOOQ中的查询对象具有连接的配置:
这是否意味着查询应仅构建在活动连接上下文上?
免责声明:我现在几周都在使用jOOQ,也许我只是缺少一些文档。例如,下一个代码不是线程安全的,除非它通过查询同步,否则它将不安全。
ctx.fetch(query).map(mapper);
源于2157版本3.5.3的DefaultDSLContext.fetch
public <R extends Record> Result<R> fetch(ResultQuery<R> query) {
final Configuration previous = Utils.getConfiguration(query);
try {
query.attach(configuration());
return query.fetch();
}
finally {
query.attach(previous);
}
}
答案 0 :(得分:2)
为不同的连接/上下文重用相同的查询对象
你不应该用jOOQ 3.x这样做。为什么(某些)jOOQ QueryParts
是可变的,有各种历史原因。这将改变 - 希望 - 在jOOQ 4.0中。背景信息:
如果无法使用相同的查询实例,请将查询用作模板
你总能做的是实现AST构造函数,它可以即时生成新的QueryParts
,例如:
public static Condition template(...) {
Condition result = DSL.trueCondition();
if (...)
result = result.and(...);
return result;
}
这显然也适用于完整的查询。