2015-12-02 40 views
1

我使用org.jooq.impl.Executor來創建一個查詢,我想傳遞給JdbcOperations。我通過使用.where(Condition...)來傳遞參數值。JOOQ如何做聯合和在哪裏在

鏈接執行器的方法後,我得到一個Query對象。問題是當我打電話query.getSQL()時,返回的查詢字符串包含參數?,?,?而不是我插入的值。

這是我用來構建SQL查詢的代碼。 請注意TableA有三個外鍵TableB。我試圖用JOIN ONOR來加入TableATableB,但是性能太慢了。

Query query = executor.select(fieldsToSelect) 
    .from("TableA") 
    .join("TableB").on("TableA.FirstForeignKey = TableB.TableBID") 
    .join("TableC") 
    .on("TableC.TableCID = TableB.TableCForeignKey") 
    .where(condition) 
    .union(executor.select(fieldsToSelect) 
      .from("TableA") 
      .join("TableB").on("TableA.SecondForeignKey = TableB.TableBID") 
      .join("TableC") 
      .on("TableC.TableCID = TableB.TableCForeignKey") 
      .where(condition) 
      .union(executor.select(fieldsToSelect) 
        .from("TableA") 
        .join("TableB").on("TableA.ThirdForeignKey = TableB.TableBID") 
        .join("TableC") 
        .on("TableC.TableCID = TableB.TableCForeignKey") 
        .where(condition))); 

這是我如何創建Condition對象爲遺囑執行人:

MySQLFactory.fieldByName(Integer.class, TABLE_NAME_TABLEA, "TableAID") 
       .in(ArrayUtils.toObject(ids)); 

這是我如何執行查詢:

jdbcOperations.query(query.getSQL(),query.getBindValues().toArray(), myMapper); 

我怎樣才能正確地映射其值和使用參數查詢JdbcOperations

+0

嗯,'Executor'和'JdbcOperations' ...這是一個比較老的版本jOOQ的,不是嗎?這是什麼版本? –

+0

該項目有3.0.0-RC2版本的JOOQ – droid8421

+0

呵呵,我知道了。 'Executor'類型只在開發jOOQ 3.0時纔出現,而不是在最終版本中。你一定要升級!無論如何,我會給你一個我認爲可以與你的版本一起工作的答案... –

回答

1

默認情況下,Query.getSQL()方法返回帶綁定變量的查詢(?)。然後你會說SQL字符串傳遞到PreparedStatement和單獨綁定變量,通過Query.getBindValue()

第一提取他們Query.getSQL(boolean)Query.getSQL(ParamType)方法的替代版本,將指示jOOQ的綁定變量應聯到SQL字符串,爲了形成一個靜態的SQL語句,不是一個準備好的語句。

你也可以告訴jOOQ通過您所提供的jOOQ ConfigurationSettings使用StatementType.STATIC_STATEMENT生成所有SQL語句爲靜態語句。

這一切記錄在這裏:

http://www.jooq.org/doc/latest/manual/sql-building/bind-values/inlined-parameters/