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
<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>
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. ..
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;
}
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 {
︙
︙
}
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()
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
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>
Sie erhalten es, indem Sie den Namen "named-native-query" wie unten gezeigt angeben.
List<Partition> results = em
.createNamedQuery("User.findPartition")
.getResultList()
Recommended Posts