jooq 和 java 8 流 SQL 生成
Posted
技术标签:
【中文标题】jooq 和 java 8 流 SQL 生成【英文标题】:jooq and java 8 streams SQL generation 【发布时间】:2017-07-12 04:16:33 【问题描述】:在我从online material 找到的 jooq sn-p 下面,有一个从“jooq 在这里结束”到“流开始”的过渡
这是否意味着在 fetch() 之前生成 SQL 查询? 稍后 stream() 启动后,一切都在 java 进程内的内存中
或者是像活动记录DSL这样的java 8流和整个sn-p被转换成SQL查询,包括stream()部分?
这是因为我在许多在线示例中看到了 sortBy / groupingBy 在流内部完成的示例,而它们也可以在 SQL 中完成
DSL.using(c)
.select(
COLUMNS.TABLE_NAME,
COLUMNS.COLUMN_NAME,
COLUMNS.TYPE_NAME
)
.from(COLUMNS)
.orderBy(
COLUMNS.TABLE_CATALOG,
COLUMNS.TABLE_SCHEMA,
COLUMNS.TABLE_NAME,
COLUMNS.ORDINAL_POSITION
)
.fetch() // jOOQ ends here
.stream() // Streams start here
.collect(groupingBy(
r -> r.getValue(COLUMNS.TABLE_NAME),
LinkedHashMap::new,
mapping(
r -> new Column(
r.getValue(COLUMNS.COLUMN_NAME),
r.getValue(COLUMNS.TYPE_NAME)
),
toList()
)
))
.forEach(
(table, columns) ->
// Just emit a CREATE TABLE statement
System.out.println(
"CREATE TABLE " + table + " (");
// Map each "Column" type into a String
// containing the column specification,
// and join them using comma and
// newline. Done!
System.out.println(
columns.stream()
.map(col -> " " + col.name +
" " + col.type)
.collect(Collectors.joining(",\n"))
);
System.out.println(");");
);
【问题讨论】:
【参考方案1】:这是否意味着在 fetch() 之前生成 SQL 查询?稍后 stream() 启动后,一切都在 java 进程内的内存中
是的
或者是像活动记录 DSL 这样的 java 8 流和整个 sn-p 被转换为 SQL 查询,包括 stream() 部分?
没有
这是因为我在许多在线示例中看到了 sortBy / groupingBy 在流内部完成的示例,而它们也可以在 SQL 中完成
您可能是指JINQ library。
虽然 jOOQ 允许您访问 Java 8 Stream
API(因为实际上每个 jOOQ 结果都是一个List
,并且您可以在任何列表上调用List.stream()
),但它不会将流操作转换为SQL。虽然 JINQ 等库证明这是可能的,但原则上,Stream
API 提供的功能很多比 SQL 语言少,这不符合 jOOQ 为用户提供完全 SQL 语言访问权限的愿景。
【讨论】:
以上是关于jooq 和 java 8 流 SQL 生成的主要内容,如果未能解决你的问题,请参考以下文章
JOOQ 强制类型无法通过 JPADatabase 代码生成生成 NUMERIC SQL 数据类型