Maison > Java > javaDidacticiel > Une brève introduction à l'utilisation des instructions SQL dans le framework Hibernate de Java

Une brève introduction à l'utilisation des instructions SQL dans le framework Hibernate de Java

高洛峰
Libérer: 2017-01-23 11:32:54
original
1183 Les gens l'ont consulté

Il existe une syntaxe de requête HQL dans Hibernate. Mais nous sommes plus familiers avec les instructions SQL, alors comment devrions-nous faire en sorte qu'Hibernate prenne en charge SQL ? Nous n’avons pas besoin d’y penser, l’équipe Hibernate l’a déjà fait.
Sans plus attendre, donnons un exemple.

select * from t_user usr
Copier après la connexion
Copier après la connexion

Ce qui précède est une instruction SQL, ce qui est absurde. Tout le monde le sait. Nous voulons qu'Hibernate exécute cette instruction, que devons-nous faire ? Regardez le code :

Query query = session.createSQLQuery("select * from t_user usr");
Copier après la connexion

Ça y est, tout le monde devrait connaître la suite, les requêtes ordinaires.
Ainsi, une fois la requête terminée, qu'est-ce qui est renvoyé ?

while(iter.hasNext()){
 Object[] objs = (Object[])iter.next();
 for (int i = 0; i < objs.length; i++) {
 System.out.print(objs[i]);
 }
 System.out.println();
}
Copier après la connexion

Chaque résultat renvoyé est un tableau Object[],

À ce moment-là, quelqu'un est sorti et a dit orienté objet. Oui, c'est orienté objet, hélas, ce n'est pas possible.
Continuons la lecture :

select {usr.*} from t_user usr
Copier après la connexion

En voyant cela, je suppose que certaines chaussures pour enfants commencent à remuer. C'est quoi ces bretelles ?
Ne vous précipitez pas, prenez votre temps. Continuons d'abord à regarder le code.

Query query = session.createSQLQuery("select {usr.*} from t_user usr").addEntity(TUser.class);
Copier après la connexion

Nous voyons que la différence par rapport à avant est que nous avons ajouté une addEntity. Qu'est-ce que cela signifie ?
Nous sommes allés directement sur l'API et avons vu une série d'explications comme celle-ci :

addEntity
SQLQuery addEntity(String tableAlias,
   Class entityType)
Declare a "root" entity
Parameters:
tableAlias - The SQL table alias
entityType - The java type of the entity to add as a root
Copier après la connexion

Ce n'est pas la même chose. Vous ne pouvez l'utiliser que vous-même.
Le premier paramètre fait référence à l'alias de la table. Tout comme l'instruction ci-dessus, l'alias de notre table est usr, donc le premier paramètre est usr, et le deuxième paramètre fait référence à la classe dans laquelle le résultat de la requête doit être mappé. Ici, puisque nous mappons TUser à la table t_user dans le fichier de mappage, nous avons bien sûr TUser ici. Puis, lorsque j'ai vérifié, une instruction SQL est sortie et le résultat était de type TUser.
Le résultat que nous avons trouvé est :

org.hibernate.tutorial.domain6.TUser@198cb3d
Copier après la connexion

Bien sûr, le vôtre doit être différent du mien. Ne bouge pas.

Peut-être que nous n'avons pas besoin de tous les vérifier. Pour le moment, il nous suffit de définir l'alias :

select u.id as {usr.id},u.name as {usr.name},u.age as {usr.age} from t_user u
Copier après la connexion

Nous voyons que nous avons utilisé. comme le précise l'alias du champ, c'est toujours pareil dans le programme :

Query query = session.createSQLQuery("select u.id as {usr.id},u.name as {usr.name},u.age as {usr.age} from t_user u").addEntity("usr",TUser.class);
Copier après la connexion

C'est simple, pas grand chose à dire.

Nous avons mentionné précédemment que certaines équipes stipuleront de ne pas écrire d'instructions SQL dans le code, ce qui nécessite des fichiers de configuration.
Nous pouvons ajouter dans le fichier de configuration :

<sql-query name="queryTUser">
 <return alias="usr" entity-name="org.hibernate.tutorial.domain6.TUser" />
 select {usr.*} from t_user usr where name=:name
</sql-query>
Copier après la connexion

Notez que le nom de l'entité ici doit être le nom complet du package, sinon une erreur sera signalée. Ici, nous avons le retour de la sous-balise, qui spécifie l'alias et le nom de classe de la table afin que nous n'ayons pas besoin d'ajouter une entité au moment de l'exécution.
Regardez le code :

Query query = session.getNamedQuery("queryTUser");
query.setParameter("name","shun");
List list = query.list();
Iterator iter = list.iterator();
Copier après la connexion


Nous sommes OK, juste comme ça. Notez que nous n'avons pas ajouté addEntity, principalement en raison de la configuration dans le fichier de configuration. .
Notez que si configuré dans le fichier de configuration, il doit y avoir une sous-balise de retour spécifiant l'alias de la table et le nom de la classe. Il s’agit principalement d’éviter des jugements répétés lorsque nous lisons des déclarations.


Nous parlons depuis si longtemps de tables avec des alias, donc si notre table n'a pas d'alias, mais que nous voulons encapsuler les résultats renvoyés dans un objet, que devons-nous faire ?

select * from t_user usr
Copier après la connexion
Copier après la connexion

C'est très simple, il suffit d'appeler la méthode surchargée addEntity(Class clazz) de addEntity. Il vous suffit de fournir un nom de classe sans avoir besoin d'un alias de table.

Bien sûr, hibernate prend également en charge les procédures stockées. Il vous suffit de définir l'attribut callable de sql-query sur true dans le fichier de configuration, ce qui signifie que la procédure stockée est actuellement appelée puisque je ne le fais pas. J'ai beaucoup d'exposition aux procédures stockées, j'en ferai davantage à l'avenir, puis je l'étudierai avec tout le monde.

Lorsque nous appelons session.save et d'autres méthodes de manipulation de données correspondantes, elles seront converties en instruction SQL intégrée d'hibernate, mais que se passe-t-il si nous voulons contrôler nous-mêmes le format de l'instruction SQL ?
Hibernate y a pensé aussi.
Nous ajoutons directement au fichier de mappage :

<sql-insert>
 INSERT INTO T_USER (NAME,AGE) values (?,?)
 </sql-insert>
 <sql-update>
 UPDATE USER SET USER_NAME=?,AGE=? WHERE uSER_ID=?
</sql-update>
Copier après la connexion

Notez que cela doit être ajouté dans la balise de classe en tant que sous-balise. Nous utilisons ici toutes les lettres majuscules pour les distinguer des instructions par défaut d'hibernate et n'avons aucune autre signification.
Jetons d'abord un coup d'œil à l'appel à insérer :

User user = new User();
user.setName("shun123123");
user.setAge(23);
Copier après la connexion

Lorsque nous appelons save, l'instruction hibernate est :
Hibernate :

INSERT INTO USER(USER_NAME,AGE) values(?,?)
Copier après la connexion

Il appelle l'instruction dans la balise sql-insert que nous avons configurée
Jetons un coup d'œil à l'appel de mise à jour :

User user = (User)session.get(User.class,new Long(29));
user.setName("shun123123");
user.setAge(23);
session.save(user);
Copier après la connexion

Nous appelons save , il appellera automatiquement la mise à jour. L'instruction à ce moment est :
Hibernate :

UPDATE USER SET USER_NAME=?,AGE=? WHERE uSER_ID=?
Copier après la connexion

Nous voyons que l'instruction de sortie est en majuscule, ce qui signifie que le L'instruction que nous avons configurée est appelée instruction.

L'instruction delete est également configurée de la même manière.

Pour plus d'articles sur l'introduction simple de l'utilisation des instructions SQL dans le framework Hibernate de Java, veuillez faire attention au site Web PHP chinois !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal