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
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.
Wenn Sie bereit sind, Ihr Wissen über jOOQ zu erweitern, bieten wir auch jOOQ-Kurse für Webentwickler an.
- Microservices - 18.01.2024
- IT-Sicherheitsrisiken - 22.12.2023
- Java Champion - 06.12.2023