Qu'est-ce qu'une requête nommée ?
Hibernate vous permet de définir des instructions de requête sous forme de chaînes dans le fichier de mappage. Cette méthode de requête est appelée requête nommée.
Quels sont les avantages de l’utilisation de requêtes nommées ?
Étant donné que l'utilisation du HQL d'Hibernate nécessite souvent l'écriture d'instructions de requête de chaîne dans du code Java, HQL est mélangé entre les codes, détruisant la lisibilité du code. En utilisant des requêtes nommées, vous pouvez séparer la logique métier et les instructions de requête, ce qui vous permet de vous concentrer sur les requêtes. Le code SQL ou HQL est dispersé dans toute l'application.
Les requêtes nommées peuvent être utilisées pour traiter des requêtes complexes
Comment implémenter une requête nommée ?
Présentation des méthodes suivantes :
Méthode 1 : déclarer l'instruction de requête sous la balise <class/> dans le fichier de configuration
Copiez le code comme suit :
<cartographie-hibernation>
<class name="com.test.bean.Student" table="student" catalog="users">
<id name="id" type="integer">
<nom de la colonne="id" />
<générateur />
</id>
<property name="name" type="string">
<nom de la colonne="nom" longueur="11" />
</propriété>
<nom de la propriété="age" type="integer">
<nom de la colonne="âge" />
</propriété>
<nom de la propriété="sex" type="string">
<nom de la colonne="sexe" longueur="2" />
</propriété>
</classe>
<!-- Définir l'instruction de requête-->
<query name="findStudentByName">
<![CDATA[from Student Where name = :name]]>
</requête>
</hibernate-mapping>
Remarque : Que signifie <![CDATA[ ]]> ?
Indique qu'il s'agit de texte brut. Sans cela, les caractères < > & ne peuvent pas être directement stockés en XML et doivent être échappés. Cependant, avec cette balise, ces symboles peuvent être stockés dans des documents XML sans s'échapper. Cela peut éviter des symboles spéciaux inattendus provoquant des erreurs d'analyse XML.
Copiez le code comme suit :
liste publique<Étudiant> requête(){
Session session = HibernateSessionFactory.getSession();
Requête q = session.getNamedQuery("findStudentByName");
q.setString("nom", "zhangsan");
List<Étudiant> list = q.list();
liste de retour ;
}
Méthode 2 : Vous pouvez également déclarer l'instruction de requête dans la balise <class/> du fichier de configuration, mais vous devez la spécifier lors de l'appel du code java (package + classe + nom de configuration)
Copiez le code comme suit :
<cartographie-hibernation>
<class name="com.test.bean.Student" table="student" catalog="users">
<id name="id" type="integer">
<nom de la colonne="id" />
<générateur />
</id>
<property name="name" type="string">
<nom de la colonne="nom" longueur="11" />
</propriété>
<nom de la propriété="age" type="integer">
<nom de la colonne="âge" />
</propriété>
<nom de la propriété="sex" type="string">
<nom de la colonne="sexe" longueur="2" />
</propriété>
<!-- Définir l'instruction de requête-->
<query name="findStudentByName">
<![CDATA[from Student Where name = :name]]>
</requête>
</classe>
</hibernate-mapping>
liste publique<Étudiant> requête(){
Session session = HibernateSessionFactory.getSession();
Requête q = session.getNamedQuery("com.test.bean.Student.findStudentByName");
q.setString("nom", "zhangsan");
List<Étudiant> list = q.list();
liste de retour ;
}
Troisième méthode : utilisez la requête SQL native <sql-query> Dans cette méthode, toutes les colonnes de la table doivent être écrites, sinon une erreur « nom de colonne invalide » se produira à moins que vous n'utilisiez return-scalar pour définir le type de champ.
Copiez le code comme suit :
<cartographie-hibernation>
<class name="com.test.bean.Student" table="student" catalog="users">
<id name="id" type="integer">
<nom de la colonne="id" />
<générateur />
</id>
<property name="name" type="string">
<nom de la colonne="nom" longueur="11" />
</propriété>
<nom de la propriété="age" type="integer">
<nom de la colonne="âge" />
</propriété>
<nom de la propriété="sex" type="string">
<nom de la colonne="sexe" longueur="2" />
</propriété>
</classe>
<!-- Définir l'instruction de requête-->
<sql-query name="findStudentByName">
<retour alias="s">
</retour>
<![CDATA[select {s.*} parmi les étudiants où s.name = :name]]>
</sql-requête>
</hibernate-mapping>
Remarque : Vous pouvez également utiliser la balise <return-property/> à l'intérieur de la balise <return/> pour lister tous les champs de la table. De la même manière que la méthode décrite ci-dessus, toutes les colonnes sont interrogées.
Copiez le code comme suit :
liste publique<Étudiant> requête(){
Session session = HibernateSessionFactory.getSession();
Requête q = session.getNamedQuery("findStudentByName");
q.setString("nom", "zhangsan");
List<Étudiant> list = q.list();
liste de retour ;
}
Méthode 4 : Utilisez la requête SQL native <sql-query> Si vous utilisez return-scalar pour définir le type de champ, vous pouvez interroger certains champs.
Copiez le code comme suit :
<cartographie-hibernation>
<class name="com.test.bean.Student" table="student" catalog="users">
<id name="id" type="integer">
<nom de la colonne="id" />
<générateur />
</id>
<property name="name" type="string">
<nom de la colonne="nom" longueur="11" />
</propriété>
<nom de la propriété="age" type="integer">
<nom de la colonne="âge" />
</propriété>
<nom de la propriété="sex" type="string">
<nom de la colonne="sexe" longueur="2" />
</propriété>
</classe>
<!-- Définir l'instruction de requête-->
<sql-query name="findStudentByName">
<return-scalar column="nom" type="string"/>
<return-scalar column="age" type="integer"/>
<![CDATA[select s.name , s.age from student swhere s.name = :name]]>
</sql-requête>
</hibernate-mapping>
liste publique<Object[]> query(){
Session session = HibernateSessionFactory.getSession();
Requête de requête = session.getNamedQuery("findStudentByName");
query.setString("nom", "zhangsan");
List<Object[]> list = query.list();
liste de retour ;
}
ou :
Copiez le code comme suit :
liste publique<Étudiant> requête(){
Session session = HibernateSessionFactory.getSession();
Requête q = session.getNamedQuery("findStudentByName").
setResultTransformer(Transformers.aliasToBean(Student.class));
q.setString("nom", "zhangsan");
List<Étudiant> list = q.list();
liste de retour ;
}