[JAVA] (Spring-data-jpa) So erhalten Sie POJO (außer Entitätsklasse) mit JPA2.1

Einführung

Wenn Sie spring-data-jpa verwenden, um den Wert abzurufen, unabhängig davon, ob Sie JPQL oder NativeQuqery verwenden, In diesem Fall wird die Entität (Tabellenklasse) als Rückgabewert empfangen, aber beispielsweise der Rückgabewert beim Zusammenfügen der Tabellen usw. Beschreibt, wie ein Wert in einer anderen Klasse als einer Entität empfangen wird.

Lassen Sie uns diesmal die Partitionsliste wie folgt abrufen.

query


SELECT partition_name, table_rows  FROM information_schema.partitions where table_name = 'user';

Version

Dieses Mal werden wir die folgende Version verwenden. spring-data-jpa: 1.10.5.RELEASE hibernate-entitymanager: 5.1.0.Final

- Maven Definition

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>1.10.5RELEASE</version>
        </dependency>
        <!-- JPA -provider(Hibernate) -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.1.0.Final</version>
        </dependency>

--Hinweise zur Version

JPA ist im obigen Framework enthalten, aber bitte stellen Sie sicher, dass Sie es mit der obigen Version oder höher verwenden. Die Methode zum Empfangen anderer als dieser Entitätsklasse kann ab JPA 2.1 verwendet werden. Beispielsweise kann die Hibernate-Entity-Managing4-Serie nicht mit JPA 2.0 verwendet werden. Seien Sie also vorsichtig. Darüber hinaus muss das oben genannte Spring-Data-JPA auch in einer Version verwendet werden, die der Hibernate 5-Serie entspricht.

Die Schwierigkeit ist die schlechte Sichtbarkeit und der störende Geruch der Versionsverwaltung hier. ..

Verwenden Sie @SqlResultSetMapping

- Ziel POJO

Versuchen Sie, den Partitionsnamen und die Anzahl der Datensätze in der Benutzertabelle mit SqlResultSetMapping abzurufen.

Abfrage ausführen


SELECT partition_name, table_rows  FROM information_schema.partitions where table_name = 'user';

Partition.class(Rückgabewert-Speicherklasse)



@AllArgsConstructor
@Data
public class Partition implements Serializable {
    private static final long serialVersionUID = -9071293948637991593L;
    /**Partitionsname*/
    private String partitionName;
    /**Anzahl der Datensätze*/
    private String table_rows;
}

- @ SqlResultSetMapping-Definition

Ab Jpa2.1 ist ConstructorResult in SqlResultSetMapping verfügbar. Um es in der obigen Partition.class zu erhalten, definieren Sie wie folgt. Der Name kann frei definiert werden, und @ConstructorResult gibt die zu empfangende Klassen- und Spaltendefinition an.

** Stellen Sie sicher, dass Sie dieses @SqlResultSetMapping für die Entitätsklasse implementieren. ** ** ** Wenn Sie es außerhalb der Entitätsklasse definieren, tritt eine MappingException auf.

SqlResultSetMapping-Definitionsmethode


@SqlResultSetMapping(
  name = "User.Partition", 
  classes = { 
    @ConstructorResult(
      targetClass = com.sample.orm.entity.transience.Partition.class,
      columns = { 
        @ColumnResult(name = "partition_name", type = String.class)
        @ColumnResult(name = "table_rows", type = String.class)
      }
    )
  }
)
@Data
@Entity
@Table(name = "user")
public class User implements Serializable {

   ︙
   ︙
}

- SQL-Ausführungsmethode

Wenn Sie es mit NativeQuery erhalten, können Sie es erhalten, indem Sie den obigen Zuordnungsnamen angeben. Natürlich ist es auch in JQPL verfügbar.

List<Partition> results = em
          .createNativeQuery(
            "SELECT partition_name, table_rows FROM information_schema.partitions where table_name = 'user'",
            "User.Partition" ) 
          .getResultList()

Verwenden Sie die SQL-Ergebnismengenzuordnung in orm.xml.

--orm.xml Platzierungsort

Da die oben beschriebene Methode mit @SqlResultSetMapping für die Entitätsklasse definiert werden muss, ist die Entität in der Regel kompliziert, wenn mehrere Definitionen vorgenommen werden. (Da die Methode zum Definieren jedes POJO nicht verwendet werden kann) Verwenden Sie orm.xml, um dies zu vermeiden. Wenn Sie die unten stehende "Paketkonfiguration" in orm.xml direkt unter META-INF platzieren, wird sie gelesen, auch wenn sie nicht in applicationContext.xml definiert ist.

Paketkonfiguration


-Java
-Ressourcen
     |
     |_conf
              |_☓☓☓
              |_☓☓☓
     |_META-INF
              |_orm.xml
     |_applicationContext.xml

--orm.xml Definition

Unten ist die Definition von orm.xml. ** Bitte beachten Sie, dass sich die Definition von "Entity-Mappings" zwischen Version 2.1 und anderen unterscheidet. ** ** ** ** Geben Sie unbedingt 2.1 an, da es sich um eine Funktion aus 2.1 handelt, um POJO in "Konstruktor-Ergebnis" zu definieren. ** ** **

Der Name "SQL-Ergebnismengen-Mapping" ist willkürlich, sollte jedoch mit "Ergebnismengen-Mapping" von "Named-Native-Query" übereinstimmen. Außerdem ist "named-native-query" nicht erforderlich. Es funktioniert auch, wenn Sie SQL direkt in die Implementierungsklasse schreiben.

orm.xml


<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings
        xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm_2_1.xsd"
        version="2.1">

    <named-native-query name="User.findPartition" result-set-mapping="User.Partition">
        <query><![CDATA[SELECT partition_name, table_rows FROM information_schema.partitions where table_name = 'user']]></query>
    </named-native-query>

    <sql-result-set-mapping name="User.Partition">
        <constructor-result target-class="com.sample.orm.entity.transience.Partition">
            <column name="partitionName" class="java.lang.String"/>
            <column name="tableRows" class="java.lang.Integer"/>
        </constructor-result>
    </sql-result-set-mapping>
</entity-mappings>

- SQL-Ausführung

Sie erhalten es, indem Sie den Namen "named-native-query" wie unten gezeigt angeben.

List<Partition> results = em
          .createNamedQuery("User.findPartition") 
          .getResultList()

Recommended Posts

(Spring-data-jpa) So erhalten Sie POJO (außer Entitätsklasse) mit JPA2.1
[Java] Wie man mit der String-Klasse an die Spitze eines bestimmten Strings kommt
So erhalten Sie Keycloak-Anmeldeinformationen in der Interceptor-Klasse
So erhalten Sie eine Klasse von Element in Java
So erhalten Sie den Namen einer Klasse / Methode, die in Java ausgeführt wird
Erste Schritte mit JDBC mit PostgresSQL unter MacOS
Verwendung der Java-Klasse
So autorisieren Sie mit graphql-ruby
So erhalten Sie den Inhalt von Map mithilfe des for-Anweisungsmemorandums
[JPA] Speichern, wenn Sie andere Elemente als Schlüssel in der Schnittpunkttabelle haben, die sich auf ManyToMany beziehen
Abrufen des Datums ohne Verwendung der Kalenderklasse
Verwendung von HttpClient (Get) von Java
Generieren Sie automatisch jpa-Entitäten mit Gradle
Wie fange ich mit schlank an?
So zerlegen Sie eine Java-Klassendatei
[So installieren Sie Spring Data Jpa]
Verwendung der Wrapper-Klasse
So dekompilieren Sie eine Java-Klassendatei
Verwendung von Klassenmethoden [Java]
So erstellen Sie CloudStack mit Docker
[Java] Verwendung der Math-Klasse