Normalement, lorsque vous utilisez spring-data-jpa pour obtenir la valeur, que vous utilisiez JPQL ou NativeQuqery, Dans le cas, l'entité (classe de table) est reçue comme valeur de retour, mais par exemple, la valeur de retour lorsque les tables sont jointes, etc. Décrit comment recevoir une valeur dans une classe autre qu'une entité.
Cette fois, obtenons la liste des partitions comme suit.
query
SELECT partition_name, table_rows FROM information_schema.partitions where table_name = 'user';
Version
Cette fois, nous utiliserons la version suivante. 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 est inclus dans le cadre ci-dessus, mais assurez-vous de l'utiliser avec la version ci-dessus ou supérieure. La méthode de réception autre que cette classe d'entité peut être utilisée à partir de JPA 2.1. Par exemple, hibernate-entity management 4 series ne peut pas être utilisé avec JPA 2.0, soyez donc prudent. De plus, le spring-data-jpa ci-dessus doit également être utilisé dans une version qui correspond à la série hibernate 5.
La difficulté est la mauvaise visibilité et l'odeur gênante de la gestion des versions ici. ..
Essayez d'obtenir le nom de la partition et le nombre d'enregistrements dans la table utilisateur à l'aide de SqlResultSetMapping.
Exécuter l'ordre
SELECT partition_name, table_rows FROM information_schema.partitions where table_name = 'user';
Partition.class(Classe de stockage de la valeur de retour)
@AllArgsConstructor
@Data
public class Partition implements Serializable {
private static final long serialVersionUID = -9071293948637991593L;
/**Nom de la partition*/
private String partitionName;
/**Nombre d'enregistrements*/
private String table_rows;
}
Depuis Jpa2.1, ConstructorResult est disponible dans SqlResultSetMapping. Pour le recevoir dans la classe Partition.class ci-dessus, définissez comme suit. Le nom peut être défini librement et @ConstructorResult spécifie la définition de classe et de colonne à recevoir.
** Veillez à implémenter ce @SqlResultSetMapping sur la classe d'entité. ** ** Si vous le définissez en dehors de la classe d'entité, une exception MappingException se produira.
Méthode de définition SqlResultSetMapping
@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 {
︙
︙
}
Lorsque vous l'obtenez avec NativeQuery, vous pouvez l'obtenir en spécifiant le nom de mappage ci-dessus. Bien entendu, il est également disponible en JQPL.
List<Partition> results = em
.createNativeQuery(
"SELECT partition_name, table_rows FROM information_schema.partitions where table_name = 'user'",
"User.Partition" )
.getResultList()
Comme la méthode utilisant @SqlResultSetMapping décrite ci-dessus doit être définie sur la classe d'entité, l'entité a tendance à être compliquée lorsque plusieurs définitions sont faites. (Parce que la méthode de définition de chaque POJO ne peut pas être utilisée) Utilisez orm.xml pour l'éviter. Si vous placez la "configuration de package" suivante dans orm.xml directement sous META-INF, elle sera lue même si elle n'est pas définie dans applicationContext.xml.
Configuration du package
-Java
-Ressources
|
|_conf
|_☓☓☓
|_☓☓☓
|_META-INF
|_orm.xml
|_applicationContext.xml
Voici la définition de orm.xml. ** Veuillez noter que la définition de "mappages d'entités" est différente entre la version 2.1 et les autres. ** ** ** Assurez-vous de spécifier 2.1 car c'est une fonction de 2.1 pour définir POJO dans "constructeur-résultat". ** **
Le nom de "sql-result-set-mapping" est arbitraire, mais il doit correspondre à "result-set-mapping" de "named-native-query". De plus, la "requête native nommée" n'est pas requise. Cela fonctionne même si vous écrivez SQL directement dans la classe d'implémentation.
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>
Il peut être obtenu en spécifiant le nom de "named-native-query" comme indiqué ci-dessous.
List<Partition> results = em
.createNamedQuery("User.findPartition")
.getResultList()
Recommended Posts