有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

List<Person> people = new DbStream("PERSON").filter(...).limit(20l).map(...).collect(...);

我可以使用流API(可能在后台看不到JDBC的情况下)在DB上实现吗?怎么做

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


共 (2) 个答案

  1. # 1 楼答案

    可以通过使用名为Speedment的外部库来实现。它们允许您从数据库的元数据生成代码,然后使用生成的类在数据库的表上进行流式传输

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

                     -
    - UserName - Trusted - TimeOnline -                                -
    -  VARCHAR -   INT   -  BIGINT    -
                     -
    

    流媒体示例(查找10个Alpabee第一用户):

    List<String> userNames = new LinkedList<>();
    userDatabase.stream()
        .sorted( Users.USER_NAME.comparator() )
        .limit( 10 )
        .forEach( p ->  {
            users.add( p.getUsername() );
        } );
    return users;
    

    插入示例:

    userDatabase.newEmptyEntity()
                 .setUsername( "Gikkman" )
                 .setIsTrusted( 1 )
                 .setTimeOnline( 0 )
                 .persist();  //This command persists the entry to the DB
    
  2. # 2 楼答案

    做你需要做的事

    一个有趣的库JINQ,它执行符号字节码执行,将普通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,I recommend reading this interesting interview with the author

    几乎做你需要做的事

    评论中提到的另一个图书馆是jOOQ。它不会将流调用映射到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(...);
    }
    

    但是,请注意,如果将数据库放入SQL语句中,它通常会从.map().limit()等单个子句中获益

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