Java 16 Records mit JPA und jOOQ

Die  neue Java Version 16 beinhaltet ein neues Feature: Records Java Records Die  neue Java Version 16 beinhaltet ein neues

blog-post-img

Die  neue Java Version 16 beinhaltet ein neues Feature: Records

Java Records

Die  neue Java Version 16 beinhaltet ein neues Feature: Records

https://openjdk.java.net/jeps/395 “Erweiterung der Java Programmiersprache mit Records. Dies sind Klassen welche als transparente Träger für unveränderliche Daten agieren. Records kann man als nominelle Tupel ansehen.”

Lasst uns Java Records mit JPA und jOOQ kombinieren.

Die JPA Construcor Expression

Ein Weg, um Projektionin JPA Queries zu verwenden ist die Verwendung der Constructor Expression. Der Name Constructor Expression impliziert, dass der Konstruktormit den Feldern der Projektionaufgerufen wird.


select new com.demo.dto.EmployeeDTO(e.name, e.department.name) from Employee e
    

In dem Beispiel haben wir ein DTO mit dem Namen EmployeeDTO und der Konstruktornimmt zwei Strings als Parameter.

Mit Java vor Java 16 würden wie eine Klasse wie folgt erstellen:


public final class EmployeeDTO {

    private final String employeeName;
    private final String departmentName;

    public EmployeeDTO(String employeeName, String departmentName) {
        this.employeeName = employeeName;
        this.departmentName = departmentName;
    }

    public String employeeName() {
        return employeeName;
    }

    public String departmentName() {
        return departmentName;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this) return true;
        if (obj == null || obj.getClass() != this.getClass()) return false;
        var that = (EmployeeDTO) obj;
        return Objects.equals(this.employeeName, that.employeeName) &&
                Objects.equals(this.departmentName, that.departmentName);
    }

    @Override
    public int hashCode() {
        return Objects.hash(employeeName, departmentName);
    }

    @Override
    public String toString() {
        return "EmployeeDTO[" +
                "employeeName=" + employeeName + ", " +
                "departmentName=" + departmentName + ']';
    }
}
   

Dank den Java 16 Records ist dies jetzt stark vereinfacht:


public record EmployeeDTO(String employeeName, String departmentName) {
}
   

Dieser Record wird den benötigten Konstruktorsowie die Methoden, um employeeName und departmentName abzurufen, beinhalten. Er ist somit perfekt für die Constructor Expression von JPA geeignet!

jOOQ SQL Projection

Neben JPA gibt es noch eine weitere grossartige Lösung um auf relationale Datenbank-Systeme zuzugreifen: jOOQ

Mit jOOQ sind wir in der Lage, typensicheres SQL in Java zu schreiben. Und oftmals möchten wir auch DTOs als Ergebnis. Hier können Java Records glänzen:


List<EmployeeDTO> employees = dsl
   .select(EMPLOYEE.NAME, DEPARTMENT.NAME)
   .from(EMPLOYEE).join(DEPARTMENT).on(EMPLOYEE.DEPARTMENT_ID.eq(DEPARTMENT.ID))
   .fetchInto(EmployeeDTO.class);
    

Fazit

Java Records sind eine tolle Ergänzung zu der Java Sprache und passen sehr gut zu Persistenz-Technologien wie JPA oder jOOQ.

Wenn Sie es auf eigene Faust probieren möchten dann werden Sie den Beispielcode auf GitHub finden: https://github.com/72services/java16-jpa-jooq

Wenn Sie jedoch Hilfe bei der Projektumsetzung benötigen, können wir Ihnen mit unseren Schweizer IT-Beratungsdienstleistungen weiterhelfen.