我想让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
,因此标志似乎已设置。
虽然renderFormatted
和renderKeywordStyle
似乎得到尊重,但`renderNameStyle``似乎被忽略了。
我正在尝试使用不受支持的数据库,因此使用SQL99。 附带问题:为什么在JOOQ中不推荐使用SQL99?
答案 0 :(得分:3)
DSL.field(String)
方法用于将“纯SQL”嵌入到jOOQ中。 jOOQ不会解析您的SQL字符串,因此不知道您认为哪些部分是“名称”,例如type
,request
和id
。
如果您不想使用代码生成器,则应使用DSL.field(Name)
创建名称受RenderNameStyle
设置影响的字段。可以使用DSL.name(String...)
Name
我正在尝试使用不受支持的数据库,因此是SQL99。附带问题:为什么在JOOQ中不推荐使用SQL99?
因为该名称具有误导性。 jOOQ并没有真正生成SQL99,因为没有集成测试根据标准验证输出是否真正正确或有意义。在jOOQ的未来版本中,SQL99
将替换为DEFAULT
方言,这可能不适用于任何数据库。