Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用流API从数据库加载数据?_Java_Database_Jdbc_Java 8_Java Stream - Fatal编程技术网

Java 如何使用流API从数据库加载数据?

Java 如何使用流API从数据库加载数据?,java,database,jdbc,java-8,java-stream,Java,Database,Jdbc,Java 8,Java Stream,例如,我想从数据库加载数据,基于某些过滤器,将其转换(映射)到某些对象,限制数据并将其收集到列表中: List<Person> people = new DbStream("PERSON").filter(...).limit(20l).map(...).collect(...); List people=newdbstream(“PERSON”).filter(…).limit(20l).map(…).collect(…); 我可以使用流API(可能是在后台看不到JDBC的情况

例如,我想从数据库加载数据,基于某些过滤器,将其转换(映射)到某些对象,限制数据并将其收集到列表中:

List<Person> people = new DbStream("PERSON").filter(...).limit(20l).map(...).collect(...);
List people=newdbstream(“PERSON”).filter(…).limit(20l).map(…).collect(…);
我可以使用流API(可能是在后台看不到JDBC的情况下)在DB上实现吗?怎么做


*我知道它绕过了SQL语言。只是想看看是否有办法…

您可以使用一个名为。它们允许您从数据库的元数据生成代码,然后使用生成的类在数据库的表上进行流式传输

在本例中,我们使用的数据库用户有三个字段:

-----------------------------------
- UserName - Trusted - TimeOnline -                                -
-  VARCHAR -   INT   -  BIGINT    -
-----------------------------------
流式处理示例(查找10个Alpabeely第一个用户):

做你需要做的事 一个有趣的库,它执行符号字节码执行,将普通Java代码转换为SQL/JPQL或jOOQ查询。以下是一个来自文档的示例:

cityStream
   .where( c -> c.getPopulation() > 10000
         && c.getLandArea() > 300 );
以上内容将(大致)转换为以下SQL查询:

SELECT * FROM city c WHERE c.population > 10000 AND c.land_area > 300
或者,如果它是由JPQL支持的,那么它也可以生成一个完全不同的SQL查询,包括必要的连接,这取决于您指定实体和关系的方式

JINQ的灵感来自LINQ

做你需要做的事情 评论中提到的另一个库是。它不会将流调用映射到SQL,但允许您使用流畅的API编写SQL,然后使用流获取/转换结果。例如

try (Stream<CityRecord> stream =
    DSL.using(configuration)
       .selectFrom(CITY)
       .where(CITY.POPULATION.gt(10000))
       .and(CITY.LAND_AREA.gt(300))) {

    stream.map(...).limit(...).collect(...);
}
try(流)=
DSL.使用(配置)
.selectFrom(城市)
.地点(城市人口gt(10000))
和(城市土地面积gt(300))){
stream.map(…).limit(…).collect(…);
}
但是,请注意,如果将数据库放入SQL语句中,它通常会从每个单独的子句中获益,如
.map()
.limit()


(免责声明:我为jOOQ背后的公司工作)。

Speedment可以帮助您做到这一点:@assylias-jOOQ似乎没有实现流API。@AlikElzin kilaka它可以返回您可以流式处理的集合。在SQL级别进行过滤/限制比在Java级别进行过滤/限制要高效得多。。。这取决于你想要什么。还请注意,jooq有各种帮助器方法将结果转换为流,例如DSLContext.fetchStream()。比较器是什么样子的?Speedment为表列生成字段,并为不同字段生成一组方法。我在上面添加了一个比较器,可以根据用户名对用户进行排序column@AlikElzin-基拉卡是你想要的答案,还是你还需要什么?
SELECT * FROM city c WHERE c.population > 10000 AND c.land_area > 300
try (Stream<CityRecord> stream =
    DSL.using(configuration)
       .selectFrom(CITY)
       .where(CITY.POPULATION.gt(10000))
       .and(CITY.LAND_AREA.gt(300))) {

    stream.map(...).limit(...).collect(...);
}