jooq和Java 8 Streams SQL生成

5
在我从在线材料中找到的下面的jooq片段中,从“jooq结束”到“流开始”有一个转换。
这是否意味着SQL查询生成一直持续到fetch()? 然后在之后stream()开始,所有内容都在java进程内存中。
还是Java 8流像活动记录DSL,整个片段都被转换成包括stream()部分的SQL查询?
这是因为我看到很多在线示例中在流内部进行了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个回答

4

这是否意味着SQL查询生成会一直持续到fetch()?然后在stream()之后,所有内容都在Java进程内存中

是的

还是说Java 8流像活动记录DSL一样,整个片段都被转换为SQL查询,包括stream()部分?

不是的

这是因为我看到许多在线示例中在流中进行sortBy/groupingBy等操作时,它们也可以在SQL中完成

您可能指的是JINQ库

jOOQ可以让你访问Java 8的Stream API(因为每个jOOQ结果实际上都是一个List,并且你可以在任何列表上调用List.stream()),但它不会将流操作转换为SQL。虽然像JINQ这样的库证明了这在原则上是可能的,但是Stream API提供的功能比SQL语言要少得多,这与jOOQ给用户完全的SQL语言访问权限的愿景不符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接