1. 程式人生 > >Java 11:JOIN表,獲取Java流

Java 11:JOIN表,獲取Java流

Java 8和JOIN

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和JOIN

在新的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()方法從我們想要用作連線條件的第一個表中獲取一列。所以,在這個例子中,我們將得到匹配LanguageFilm實體在列Film.LANGUAGE_ID相等Language.LANGUAGE_ID

最後,build()將構造我們的Join物件,反過來,它可以用於建立Java Streams。Join物件可以一遍又一遍地重複使用。

加入型別和條件

我們可以使用innerJoinOn()leftJoinOn()rightJoinOn()以及  crossJoin()和表格可以使用條件×××equal()notEqual()lessThan()lessOrEqual()greaterThan(),和lessOrEqual()