[JAVA] (Spring-data-jpa) Comment obtenir POJO (autre que la classe d'entité) à l'aide de JPA2.1

introduction

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

--maven définition

        <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>

--Notes sur la version

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. ..

Utiliser @SqlResultSetMapping

- POJO cible

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;
}

- @ Définition de SqlResultSetMapping

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 {

   ︙
   ︙
}

- Méthode d'exécution SQL

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()

Utilisez sql-result-set-mapping dans orm.xml.

--orm.xml emplacement de placement

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

--orm.xml définition

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>

--Exécution SQL

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

(Spring-data-jpa) Comment obtenir POJO (autre que la classe d'entité) à l'aide de JPA2.1
[Java] Comment accéder au début d'une chaîne spécifique à l'aide de la classe String
Comment obtenir les informations d'identification Keycloak dans la classe d'intercepteur
Comment obtenir une classe depuis Element en Java
Comment obtenir le nom d'une classe / méthode exécutée en Java
Comment démarrer avec JDBC en utilisant PostgresSQL sur MacOS
Comment utiliser la classe Java
Comment autoriser à l'aide de graphql-ruby
Comment obtenir le contenu de la carte à l'aide du mémorandum d'instructions
[JPA] Comment enregistrer lorsque vous avez des éléments autres que des clés dans la table d'intersection liés à ManyToMany
Obtenir la date sans utiliser la classe Calendar
Comment utiliser HttpClient de Java (Get)
Générez automatiquement des entités jpa à l'aide de Gradle
Comment démarrer avec Slim
Comment désassembler un fichier de classe Java
[Comment installer Spring Data Jpa]
Comment utiliser la classe wrapper
Comment décompiler un fichier de classe Java
Comment utiliser les méthodes de classe [Java]
Comment créer CloudStack à l'aide de Docker
[Java] Comment utiliser la classe Math