是否曾经想过如何将联接的数据库表转换为Java Stream? 阅读这篇简短的文章,并了解如何使用Speedment Stream ORM完成它。 我们将从Java 8示例开始,然后研究Java 11的改进。
Java 8和JOIN
速度允许将动态JOIN:ed数据库表作为标准Java流使用。 我们首先来看一个使用Sakila示例数据库的Java 8解决方案:
Speedment app = ...;JoinComponent joinComponent = app.getOrThrow(JoinComponent.class);Join<Tuple2OfNullables<Language, Film>> join = joinComponent.from(LanguageManager.IDENTIFIER).innerJoinOn(Film.LANGUAGE_ID).equal(Language.LANGUAGE_ID).build();join.stream().forEach(System.out::println);
这将产生以下输出(经过重新格式化并缩短了可读性):
Tuple2OfNullablesImpl {LanguageImpl { languageId = 1, name = English, ... }, FilmImpl { filmId = 1, title = ACADEMY DINOSAUR, ... }
}
Tuple2OfNullablesImpl {LanguageImpl { languageId = 1, name = English, ... }, FilmImpl { filmId = 2, title = ACE GOLDFINGER, ... }
}
Tuple2OfNullablesImpl {LanguageImpl { languageId = 1, name = English, ... },FilmImpl { filmId = 3, title = ADAPTATION HOLES, ... }
}
...
Java 11和JOIN
在新的Java版本11中,存在Local-Variable-Type-Inference(又称var
声明),这使得使用Speedment编写联接更加容易。 我们不必显式声明join变量的类型:
Speedment app = ...;JoinComponent joinComponent = app.getOrThrow(JoinComponent.class);var join = joinComponent.from(LanguageManager.IDENTIFIER).innerJoinOn(Film.LANGUAGE_ID).equal(Language.LANGUAGE_ID).build();join.stream().forEach(System.out::println);
代码分解
from()
方法获取我们要使用的第一个表( Language
)。 innerJoinOn()
方法采用我们要连接的第二张表的特定列。 然后, equal()
方法从我们要用作连接条件的第一个表中获取一列。 因此,在此示例中,我们将获得匹配的Language
和Film
实体,其中Film.LANGUAGE_ID
列等于Language.LANGUAGE_ID
。
最后, build()
将构造我们的Join
对象,该对象又可以用于创建Java Streams。 Join
对象可以反复使用。
JOIN的类型和条件
我们可以使用innerJoinOn()
leftJoinOn()
rightJoinOn()
和crossJoin()
和表可以使用的条件被接合equal()
notEqual()
lessThan()
lessOrEqual()
greaterThan()
和lessOrEqual()
下一步是什么?
在此处下载开源Java 11。
在此处下载Speedment。
阅读Speedment用户指南中有关JOIN功能的所有内容。
翻译自: https://www.javacodegeeks.com/2018/12/java-11-join-tables-java-streams.html