Java14 Records in Joins
Did you know that you can join database tables into a Java Stream with Java 14's preview 
record feature? Read this short article and find out how it is done using the 
Speedment Stream ORM. We will start with how to set up your project.
Setup
Download 
Java 14. Go to the 
Speedment Initializer and download your project skelaton (including 
pom.xml). Modify the following lines in your 
pom.xml file:
 
<maven.compiler.source>14</maven.compiler.source>
<maven.compiler.target>14</maven.compiler.target>
...
    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
            <release>14</release>
            <compilerArgs>
                --enable-preview
            </compilerArgs>
        </configuration>
    </plugin>
Make sure that you have the latest version of your ide (e.g. IDEA 2010.1) that supports the new Java 14 features.
Speedment Joins
Speedment allows dynamically JOIN:ed database tables to be consumed as standard Java Streams. In this article, we will use the exemplary Sakila database that contains films, actors, languages etc. Download Sakila 
here or grab a Docker version 
here
Tables, views and joins can easily be turned into standard Java streams with Speedment. This is how it can look like in Java 14:
            
    var speedment = new SakilaApplicationBuilder()
            .withPassword("sakila")
            .withBundle(JoinBundle.class)
            .build();
    var joinComponent = speedment.getOrThrow(JoinComponent.class);
    var films = speedment.getOrThrow(FilmManager.class);
    // Define a Java 14 "record" that can hold a Film and a Language
    record FilmLanguage(Film film, Language language) {}
    var join = joinComponent.from(films.getTableIdentifier())
            .leftJoinOn(Language.LANGUAGE_ID).equal(Film.LANGUAGE_ID)
            // Provide the constructor of the Java 14 "record"
            // to be used to construct Film/Language composites
            .build(FilmLanguage::new);
    join.stream()
            .forEach(filmLanguage -> System.out.format(
                    "%s is in %s%n",
                    filmLanguage.film().getTitle(),
                    filmLanguage.language().getName())
            );
This will produce the following output:
ACADEMY DINOSAUR is in English
ACE GOLDFINGER is in English
ADAPTATION HOLES is in English
...
Code Breakdown
The 
from() method takes the first table we want to use (
Film). The 
innerJoinOn() method takes a specific column of the second table we want to join. Then, the 
equal() method takes a column from the first table that we want to use as our join condition. So, in this example, we will get matched 
Film and 
Language entities where the column 
Language.LANGUAGE_ID equal 
Film.LANGUAGE_ID.
Finally, 
build() will construct our 
Join object that can, in turn, be used to create Java Streams. The 
Join object can be re-used over and over again.
Note how the constructor of the 
record FilmLanguage is provided in the 
build() method. Note also how a film and language entity can be obtained from the record (e.g. 
filmLanguage.film()). This is a big improvement over previous Java version where we had to provide rather lengthy custom classes or use tuples with accessor like 
get0() and 
get1() rather than the much more descriptive 
film() and 
language()
JOIN Types and Conditions
We can use 
innerJoinOn(), 
leftJoinOn(), 
rightJoinOn() and 
crossJoin() and tables can be joined using the conditions 
equal(), 
notEqual(), 
lessThan(), 
lessOrEqual(), 
greaterThan() and 
lessOrEqual().
What's Next?
Download open-source Java 14 
here.
Download Speedment 
here.
Read all about the JOIN functionality in 
the Speedment User's Guide.
About 
Per Minborg
Per Minborg is a Palo Alto based developer and architect, currently serving as CTO at Speedment, Inc. He is a regular speaker at various conferences e.g. JavaOne, DevNexus, Jdays, JUGs and Meetups. Per has 15+ US patent applications and invention disclosures. He is a JavaOne alumni and co-author of the publication “Modern Java”.