从jooq查询创建PreparedStatement

时间:2014-10-26 15:20:26

标签: prepared-statement jooq sqlbuilder

目前正在探索JOOQ的可能性,我想仔细开始,只使用JOOQ作为SQL构建器。我将我的数据库模式定义为派生自CustomTable的类以获得类型安全性。 这导致像

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

其中sometable是一个包含我的一个表实例的变量。

我目前使用query做的事情类似于

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

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

我想使用query.getBindValues(),但这只返回要绑定到语句的普通Java对象。我必须假设订单与setObject的排名顺序匹配,此外我现在错过了getSQLType()。所以这也不是好事。

然后我希望找到类似query.getPreparedStatement(connection)之类的内容来从提供的连接创建语句,并填充所有参数,但这似乎不存在。

是否有一些巧妙的方法可以让我失踪的JOOQ PreparedStatement中出现Query

1 个答案:

答案 0 :(得分:1)

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

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

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