[JAVA] Erste Schritte mit der Doma-Projektion mit der Criteira-API

Einführung

Das Abrufen durch Angabe nur einer bestimmten Spalte in der SELECT-Klausel wird als Projektion bezeichnet. Wenn es jedoch unpraktisch ist, alle Spalten abzurufen (es gibt zu viele Spalten, gibt es große Spalten, z. B. LOBs). Dies ist eine bequeme Methode.

Dieses Mal werde ich erklären, wie die Projektion mit der Kriterien-API von Doma ausgedrückt wird.

Es gibt zwei Möglichkeiten, um mit der Kriterien-API eine Projektion zu erzielen.

Die hier verwendete Version von Doma ist 2.43.0.

Eine Übersicht über Doma und die Kriterien-API finden Sie in den anderen Artikeln unter Einführung in Doma.

In diesem Artikel verwendeter Beispielcode

Ich werde es mit einem vereinfachten Code erklären. Im vollständigen Projekt finden Sie den vollständigen Beispielcode.

Die Datenbank verfügt über eine Mitarbeitertabelle, die Mitarbeiter darstellt.

schema.sql


create table employee (
    id integer not null primary key,
    name varchar(255) not null,
    age integer not null,
    salary integer,
    job_type varchar(20),
    hiredate timestamp, 
    department_id integer, 
    version integer not null, 
    insertTimestamp timestamp, 
    updateTimestamp timestamp);

Bereiten Sie die Employee-Klasse vor, die der Employee-Tabelle entspricht.

Employee.java


@Entity(metamodel = @Metamodel)
public class Employee {
  @Id
  Integer id;
  String name;
  Age age;
  Salary salary;
  @Column(name = "JOB_TYPE")
  JobType jobType;
  LocalDate hiredate;
  @Column(name = "DEPARTMENT_ID")
  Integer departmentId;
  @Version
  @Column(name = "VERSION")
  Integer version;
  LocalDateTime insertTimestamp;
  LocalDateTime updateTimestamp;

  // getter, setter
}

Bereiten Sie ein DTO (ValueObject) vor, das das projizierte Ergebnis enthält.

NameAndSalaryDto.java


public class NameAndSalaryDto {

  private final String name;
  private final Salary salary;

  public NameAndSalaryDto(String name, Salary salary) {
    this.name = name;
    this.salary = salary;
  }

  // getter
}

Wir werden "EmployeeRepository" vorbereiten und dieser Klasse einige Methoden hinzufügen, um ein Beispiel zu zeigen.

EmployeeRepository.java


public class EmployeeRepository {

  private final Entityql entityql;
  private final NativeSql nativeSql;

  public EmployeeRepository(Config config) {
    this.entityql = new Entityql(config);
    this.nativeSql = new NativeSql(config);
  }
}

Verwenden Sie die Entitätsklasse

Dies ist eine sehr bequeme Methode in dem Sinne, dass Sie vorhandene Datenstrukturen wiederverwenden können.

Mit der Methode selectTo können Sie den projizierten Wert auf eine bestimmte Eigenschaft der Entität festlegen (andere Eigenschaften werden auf Null oder Anfangswerte festgelegt).

  public List<Employee> selectNameAndSalaryAsEntityList() {
    Employee_ e = new Employee_();
    return entityql.from(e).selectTo(e, e.name, e.salary).fetch();
  }

Die ausgegebene SQL lautet wie folgt.

select t0_.id, t0_.name, t0_.salary from Employee t0_

Die beiden Spalten Name und Gehalt sind die in der SELECT-Klausel angegebenen SQL. Es enthält einen nicht angegebenen Primärschlüssel, der beabsichtigt ist und verwendet wird, um die Eindeutigkeit der Entität innerhalb der Ergebnismenge sicherzustellen.

Verwenden Sie die Tupelklasse

Doma bietet Klassen im Paket "org.seasar.doma.jdbc.criteria.tuple", die Kombinationen von Werten wie "Tuple2", "Tuple3", ..., "Tuple9" darstellen. Die Zahl am Ende des Klassennamens gibt an, wie viele Werte die Klasse verarbeiten kann.

Das Folgende ist ein Beispiel für die Projektion von zwei Spalten mit der Klasse "Tuple2".

  public List<Tuple2<String, Salary>> selectNameAndSalary() {
    Employee_ e = new Employee_();
    return nativeSql.from(e).select(e.name, e.salary).fetch();
  }

Beachten Sie, dass wir "nativeSql" anstelle von "entityql" verwenden. Wenn Sie keine Entitäten mit einzelnen Bezeichnern verarbeiten müssen (z. B. Ergebnisse ohne Primärschlüssel abrufen oder Aggregatfunktionen verwenden), ist nativeSql eine gute Wahl.

Die ausgegebene SQL lautet wie folgt.

select t0_.name, t0_.salary from Employee t0_

Nur zwei Spalten, Name und Gehalt, sind die in der SELECT-Klausel angegebenen SQL.

Es liegt an Ihnen, wie Sie die Tuple2-9-Klasse in welcher Ebene verwenden, aber es ist ein schönes Design, sie als temporäre Datenstruktur zu verwenden, bis sie wie unten gezeigt in das DTO (oder ValueObject) der Anwendung konvertiert wird. Überlegen.

  public List<NameAndSalaryDto> selectNameAndSalaryAsNameAndSalaryDtoList() {
    Employee_ e = new Employee_();
    return nativeSql.from(e).select(e.name, e.salary).stream()
        .map(tuple -> new NameAndSalaryDto(tuple.getItem1(), tuple.getItem2()))
        .collect(Collectors.toList());
  }

Wenn Sie 10 oder mehr Spalten angeben und diese empfangen, können Sie sie mit der Schnittstelle org.seasar.doma.jdbc.criteria.tuple.Row ausdrücken. Wenn Sie jedoch eine große Anzahl von Spalten haben, verwenden Sie eine schreibgeschützte Entitätsklasse. Es ist einfacher zu verstehen, wenn Sie es erstellen.

abschließend

Ich habe erklärt, wie eine Projektion mit der Kriterien-API dargestellt wird.

Wenn es so etwas wie die Tuple-Klasse im Java-Standard gibt, würde ich sie gerne verwenden, aber es ist ärgerlich, dass sie tatsächlich nicht existiert.

Darüber hinaus wissen die Tupel 2-9-Klassen von Doma, dass sie in Kotlin verwendet werden, und unterstützen daher die Destrukturierungsdeklaration. Daher kann Kotlin wie folgt damit umgehen.

val (number, string) = Tuple2(1, "a")

Recommended Posts

Erste Schritte mit der Doma-Projektion mit der Criteira-API
Erste Schritte mit Doma-Using Joins mit der Criteira-API
Erste Schritte mit Doma-Einführung in die Kriterien-API
Erste Schritte mit Doma-Dynamic Erstellen von WHERE-Klauseln mit der Kriterien-API
Erste Schritte mit Reactive Streams und der JDK 9 Flow API
Erste Schritte mit dem Doma-Criteria API Cheet Sheet
Beginnen Sie mit der Funktionsweise von JVM GC
Erste Schritte mit DBUnit
Erste Schritte mit Ruby
Erste Schritte mit Swift
Erste Schritte mit Doma-Transaktionen
Erste Schritte mit Doma-using Logical Operators wie AND und OR in der WHERE-Klausel der Criteria-API
Erste Schritte mit der Verarbeitung von Doma-Annotationen
Erste Schritte mit JSP & Servlet
Erste Schritte mit Java Basics
Erste Schritte mit Spring Boot
Erste Schritte mit Ruby-Modulen
Jetzt ist es an der Zeit, mit der Stream-API zu beginnen
Erste Schritte mit Java_Kapitel 5_Praktische Übungen 5_4
[Google Cloud] Erste Schritte mit Docker
Erste Schritte mit Docker mit VS-Code
Zurück zum Anfang, Erste Schritte mit Java ② Steueranweisungen, Schleifenanweisungen
Fassen Sie die wichtigsten Punkte für den Einstieg in JPA zusammen, die Sie mit Hibernate gelernt haben
Erste Schritte mit Ruby für Java-Ingenieure
Erste Schritte mit Docker für Mac (Installation)
Einführung in den Parametrisierungstest in JUnit
Einführung in Java ab 0 Teil 1
Erste Schritte mit Ratpack (4) -Routing & Static Content
Erste Schritte mit dem Language Server Protocol mit LSP4J
Erste Schritte mit dem Erstellen von Ressourcenpaketen mit ListResoueceBundle
Erste Schritte mit Java_Kapitel 8_Über "Instanzen" und "Klassen"
Links & Memos für den Einstieg in Java (für mich)
Erste Schritte mit Java 1 Ähnliche Dinge zusammenstellen
Erste Schritte mit Kotlin zum Senden an Java-Entwickler
Ich habe versucht, mit Gradle auf Heroku zu beginnen
Zurück zum Anfang und erste Schritte mit Java ① Datentypen und Zugriffsmodifikatoren
Erste Schritte mit Java-Programmen mit Visual Studio Code
Erste Schritte mit älteren Java-Ingenieuren (Stream + Lambda)
Beginnen Sie mit serverlosem Java mit dem leichtgewichtigen Framework Micronaut!