2014-10-26 95 views
1

当前正在探索JOOQ的可能性,我想仔细地开始并仅将JOOQ用作SQL构建器。我将数据库模式定义为来自CustomTable的类,以获得类型安全性。 这导致了如下代码从jooq查询中创建PreparedStatement

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()); 

但只要有对语句的详细参数,我开始变得对JOOQ的实现对于setObject第一个参数复杂的依赖关系。

我以为使用query.getBindValues(),但这只返回纯Java对象绑定到语句。我必须假设该订单与setObject的订单订单相匹配,另外我现在错过了getSQLType()。所以这也不是好方法。

然后我希望找到像query.getPreparedStatement(connection)这样的东西来创建声明从提供的连接与所有参数很好地填充,但似乎并不存在。

有没有一些简洁的方法可以让我失踪的JOOQ Query中的PreparedStatement

+0

为了完整起见,您可以添加一个简短的解释,说明为什么您不想使用jOOQ来执行查询吗? – 2014-10-26 23:21:06

+0

我还没准备好将自己的灵魂完全卖给JOOQ :-)最重要的是,我读到JOOQ最初是作为一个SQL构建器开始的,我认为有三个职责的自然分离:1)获取查询或语句权限,2)通过池,连接,语句等处理与数据库的连接,3)从查询结果中读取数据。通过获取PreparedStatement来交换Connection和JOOQ查询将允许(1)和(2)很好地分离。 – Harald 2014-10-27 12:06:51

+0

你的灵魂可以跑,但它不能隐藏。 jOOQ一直准备5年的陈述 - 大公司在制作中使用...不确定你在担心什么:)从一开始,jOOQ将变量绑定到PreparedStatement。 SQL提取功能仅在后来才提供。无论如何,我会给出答案 – 2014-10-27 18:41:06

回答

1

默认情况下,每当您运行Query.execute()或任何各种ResultQuery.fetch()方法时,jOOQ会在内部创建PreparedStatements。我认为,允许用户准备声明并通过新方法Query.statement()访问这些未执行的声明可能是一个好主意。我已经添加了这是一个功能要求:

已经在今天,你可以提取SQL,并使用你所提到的API自己绑定变量,在路上或多或少你(注意,还有Query.getParams()),它以绑定顺序返回Param类型。

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

+0

感谢您将此作为功能请求。如果我有发言权,我会强烈倾向'ResultQuery.statement(Connection con)',因为只有这样才能保持拥有连接,只需将它借用到JOOQ以创建语句。 – Harald 2014-10-28 11:05:31

+0

@Harald:虽然您可能更喜欢特定的API来满足您的特定用例,但在jOOQ API的整体环境中,这将是非常令人惊讶的。在任何可比较的方法中几乎没有提及“连接”,因此在那里添加它是没有意义的。实质上,会有'ResultQuery.statement()',也许''DSLContext.statement(ResultQuery)''。这两种方法都会与现有的['ResultQuery.keepStatement()'](http://www.jooq.org/javadoc/latest/org/jooq/ResultQuery.html#keepStatement-boolean-)行为一致。我希望这是有道理的? – 2014-10-28 22:39:25

+0

我不确定应该添加方法调用,因为我会如何处理此声明?它来自我在呼叫地点并不真正拥有的联系,我想知道如果对这个声明做任何事情是否明智。但是我承认,我还没有深入到JDBC的内容。 – Harald 2014-10-30 15:53:59