2

目前在探索 JOOQ 的可能性,想谨慎入手,只使用 JOOQ 作为 SQL builder。我将我的数据库模式定义为派生的类CustomTable以获得类型安全。这导致代码像

Param<Integer> pId = ...
Query query = context.select(sometable.somefield.max())
                     .from(sometable)
                     .where(sometable.id.eq(pId)
                     ;

wheresometable是一个保存我的表实例之一的变量。

我目前所做的query类似于

PreparedStatement pstmt = connection.prepareStatement(query.getSQL());
pstmt.setObject(1, pId.getValue(), pId.getDataType().getSQLType());

但是一旦语句有更多参数,我就开始对 JOOQ 的setObject第一个参数的实现产生复杂的依赖关系。

我想使用query.getBindValues(),但这仅返回要绑定到语句的普通 Java 对象。我必须假设订单与仓位订单相匹配setObject,此外我现在错过了getSQLType(). 所以这也不是什么好办法。

然后我希望找到类似的东西query.getPreparedStatement(connection),从提供的连接中创建语句,并很好地填写所有参数,但这似乎不存在。

有什么巧妙的方法可以摆脱我缺少PreparedStatement的 JOOQ吗?Query

4

1 回答 1

2

默认情况下,jOOQPreparedStatements每次运行时都会在内部创建Query.execute(),或者任何各种ResultQuery.fetch()方法。我认为允许用户准备语句并通过新方法访问这些未执行的语句可能是一个好主意Query.statement()。我已将此添加为功能请求:

今天,您可以使用您提到的 API 自己提取 SQL 和绑定变量,或多或少采用您描述的方式(注意,还有Query.getParams()),它以绑定顺序返回Param类型。

但是请注意,通常没有任何充分的理由(除了非常高吞吐量场景中的 SQL 字符串缓存)来提取 SQL 字符串并自己通过 JDBC 直接执行它。jOOQ 主要用于呈现 SQL执行它。

于 2014-10-27T18:51:06.053 回答