Speedment允许动态JOIN:ed数据库表作为标准Java Streams使用。我们首先使用Sakila示例数据库查看Java 8的解决方案:
Speedment app = ...;
JoinComponent joinComponent = app。getOrThrow(JoinComponent。类);
加入< Tuple2OfNullables < 语言,电影>> join = joinComponent
。从(LanguageManager。IDENTIFIER)
。innerJoinOn(电影。LANGUAGE_ID)。等于(语言。LANGUAGE_ID)
。build();
加入。流()
。的forEach(系统。出来 :: 的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中,有Local-Variable-Type-Inference(aka var
声明),这使得joins
使用Speedment 编写更容易 。我们不必显式声明连接变量的类型:
Speedment app = ...;
JoinComponent joinComponent = app。getOrThrow(JoinComponent。类);
var join = joinComponent
。从(LanguageManager。IDENTIFIER)
。innerJoinOn(电影。LANGUAGE_ID)。等于(语言。LANGUAGE_ID)
。build();
加入。流()
。的forEach(系统。出来 :: 的println);
该from()
方法采用我们想要使用的第一个表(Language
)。该innerJoinOn()
方法采用我们想要加入的第二个表的特定列。然后,该equal()
方法从我们想要用作连接条件的第一个表中获取一列。所以,在这个例子中,我们将得到匹配Language
和Film
实体在列Film.LANGUAGE_ID
相等Language.LANGUAGE_ID
。
最后,build()
将构造我们的Join
对象,反过来,它可以用于创建Java Streams。该Join
对象可以一遍又一遍地重复使用。
我们可以使用innerJoinOn()leftJoinOn()
,rightJoinOn()
以及 crossJoin()
和表格可以使用条件加盟equal()
,notEqual()
,lessThan()
,lessOrEqual()
,greaterThan()
,和lessOrEqual()
。