开发者问题收集

无法在 JOOQ 中设置引号样式(RenderNameStyle.QUOTED)

2014-12-04
1135

我想让 JOOQ 渲染带引号的列名。这是我尝试过的,阅读文档和 StackOverflow:

    DSLContext sql = DSL.using( SQLDialect.SQL99, 
            new Settings()
                .withRenderNameStyle(RenderNameStyle.QUOTED)
                .withRenderFormatted(true)
                .withRenderKeywordStyle(RenderKeywordStyle.UPPER)
        );

    System.out.println( "Quoted: " + (sql.settings().getRenderNameStyle()==RenderNameStyle.QUOTED) );

    Table<Record> table = table("MyTable");
    Field<Long> lid = field("id",Long.class);

    String sqlStr = sql.renderInlined(
            sql.select( lid, field("type"), field("request.id"), field("UPPERCASE"), field("lowercase") )
            .from(table)
            .limit(1000) 
        );

    System.out.println(sqlStr);

生成的语句是:

SELECT 
   id, 
   type, 
   request.id, 
   UPPERCASE, 
   lowercase
FROM MyTable
LIMIT 1000

它输出 Quoted: true ,因此标志似乎已设置。 虽然 renderFormattedrenderKeywordStyle 似乎受到尊重,但 `renderNameStyle`` 似乎被忽略了。

我正在尝试使用不受支持的数据库,因此使用 SQL99。 附带问题:为什么 JOOQ 中弃用 SQL99?

1个回答

DSL.field(String) 方法用于将“纯 SQL”嵌入 jOOQ。 jOOQ 不会解析您的 SQL 字符串,因此不知道您将哪些部分视为“名称”,例如 typerequestid

如果您不想使用代码生成器,您应该使用 DSL.field(Name) 来创建其名称受 RenderNameStyle 设置影响的字段。 Name 可以使用 DSL.name(String...)

I'm experimenting with an unsupported database, therefore the SQL99. Side question: Why is SQL99 deprecated in JOOQ?

创建,因为名称具有误导性。jOOQ 并未真正生成 SQL99,因为没有集成测试来验证输出是否确实正确或符合标准。在 jOOQ 的未来版本中, SQL99 将被 DEFAULT 方言取代,该方言可能不适用于任何数据库。

Lukas Eder
2014-12-04