簡體   English   中英

JOOQ sql生成用於引用的位置似乎與多個對象不一致

[英]JOOQ sql generation for where in quotation seems inconsistent for multiple Objects

我一直在和JOOQ合作生成我的SQL,但是我在使用“in”子句時遇到了麻煩,我寫了一個簡單的測試來顯示我的意思:

@Test
public void testWhereInBehaviorJOOQ() {
    String expectedSingleObjectSQL = "select distinct \"Business Group\" \"Business_Group\" from \"SOME_TABLE\" where \"Business Group Process\" in ('SomeValue')";
    String expectedMultipleObjectSQL = "select distinct \"Business Group\" \"Business_Group\" from \"SOME_TABLE\" where \"Business Group Process\" in ('SomeValue','AnotherValue')";

    String actualSingleObjectSQL = generateSQLWithWhereInInline("SomeValue");
    String actualTwoObjectSQL = generateSQLWithWhereInInline("SomeValue,AnotherValue");
    String actualTwoObjectWithQuotesSQL = generateSQLWithWhereInInline("'SomeValue','AnotherValue'");
    String actualTwoObjectWithMiddleQuotesSQL = generateSQLWithWhereInInline("SomeValue','AnotherValue");


    LOGGER.info("JOOQ Generated query for single object \"someValue\" = {}",actualSingleObjectSQL );
    LOGGER.info("JOOQ Generated query for two objects without single quotes \"someValue,AnotherValue\" = {}",actualTwoObjectSQL );
    LOGGER.info("JOOQ Generated query for two objects with single quotes \"'someValue','AnotherValue'\" = {}",actualTwoObjectWithQuotesSQL);
    LOGGER.info("JOOQ Generated query for two objects with single quotes only at the middle \"someValue','AnotherValue\" = {}",actualTwoObjectWithMiddleQuotesSQL );

    Assert.assertEquals(expectedSingleObjectSQL,actualSingleObjectSQL);
    Assert.assertEquals(expectedMultipleObjectSQL,actualTwoObjectSQL);
    Assert.assertEquals(expectedMultipleObjectSQL,actualTwoObjectWithQuotesSQL);
    Assert.assertEquals(expectedMultipleObjectSQL,actualTwoObjectWithMiddleQuotesSQL);

}

private String generateSQLWithWhereInInline(String businessGroupProcess) {
    DSLContext create = DSL.using(SQLDialect.ORACLE);
    return create.
            selectDistinct(
                    DSL.fieldByName("Business Group").as("Business_Group"))
            .from(DSL.tableByName("SOME_TABLE")).where(DSL.fieldByName("Business Group Process").in(DSL.inline(businessGroupProcess))).getSQL();
}

但生成的值是:

JOOQ生成單個對象“someValue”=的查詢

select distinct "Business Group" "Business_Group" 
from "SOME_TABLE" where "Business Group Process" in ('SomeValue')

JOOQ生成的兩個對象的查詢沒有單引號“someValue,AnotherValue”=

select distinct "Business Group" "Business_Group" 
from "SOME_TABLE" where "Business Group Process" in ('SomeValue,AnotherValue')

JOOQ使用單引號“'someValue','AnotherValue'”生成兩個對象的查詢

select distinct "Business Group" "Business_Group" 
from "SOME_TABLE" 
where "Business Group Process" in ('''SomeValue'',''AnotherValue''')

JOOQ僅在中間“someValue”,“AnotherValue”=中間使用單引號生成兩個對象的查詢

select distinct "Business Group" "Business_Group" 
from "SOME_TABLE" 
where "Business Group Process" in ('SomeValue'',''AnotherValue')

因此,當只有一個對象時,它可以正常工作,對於兩個它只會在開頭和結尾添加引號,如果我在它們添加引號之前將引號添加到開頭,結尾和每個對象,如果我嘗試“欺騙“它通過在中間添加引號,希望它會嘗試將變量包裝在引號中,一切都得到報價。 空間似乎沒有幫助。

有沒有人遇到過這個? 我想知道我是在說錯了還是錯了。

jOOQ在這里按預期工作。 Field.in(...)方法通過varargs參數接受IN謂詞的多個值。 因此,如果要表示具有多個值的謂詞,則必須為該方法提供多個值。

因此,您的實用方法應為:

// I'm assuming this static import
import static org.jooq.impl.DSL.*;

private String generateSQLWithWhereInInline(String... businessGroupProcesses) {
    Field<String>[] fields = new Field[businessGroupProcesses.length];
    for (int i = 0; i < businessGroupProcesses.length; i++)
        fields[i] = inline(businessGroupProcesses[i]);

    return DSL.using(SQLDialect.ORACLE)
              .selectDistinct(
                    field(name("Business Group")).as("Business_Group"))
              .from(table(name("SOME_TABLE")))
              .where(field(name("Business Group Process")).in(fields))
              .getSQL();
}

一種更簡單的方法可能是為DSLContext提供一個設置,告訴它直接內聯所有綁定值。 這在此處記錄:

http://www.jooq.org/doc/latest/manual/sql-building/dsl-context/custom-settings

您的方法將為:

private String generateSQLWithWhereInInline(String... businessGroupProcesses) {
    Settings settings = new Settings()
        .withStatementType(StatementType.STATIC_STATEMENT);

    return DSL.using(SQLDialect.ORACLE, settings);
              .selectDistinct(
                    field(name("Business Group")).as("Business_Group"))
              .from(table(name("SOME_TABLE")))
              .where(field(name("Business Group Process"))
                    .in(businessGroupProcesses))
              .getSQL();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM