Dans l'article ci-dessus, nous avons terminé la mise en œuvre du menu EasyUi. Cliquez ici pour le voir. Dans cette section, nous écrivons principalement sur la classe d'implémentation CatégoryServiceImpl pour compléter la requête en cascade de la base de données. Généralement, le projet est réalisé de l'arrière à l'avant, faites d'abord le service (nous n'avons pas extrait DAO, et finalement extrait), puis faisons la couche supérieure après la fin.
Avant d'écrire, jetons un coup d'œil aux tables de la base de données:
Déposez la base de données s'il existe un magasin; / * Créer une base de données et définir l'encodage * / Créer un jeu de caractères par défaut de la boutique de base de données utf8; utiliser la boutique; / * Supprimer la table de l'administrateur * / Table de dépôt si existe un compte; / * Supprimer la table de catégorie de produits * / Table de dépôt si existe une catégorie; / * ===========================================================================================================================. ==============================================================================================================================. =============================================================================================================================. ==============================================================================================================================. Administrateur Nom de connexion * / Login Varchar (20), / * Nom de l'administrateur * / Nom Varchar (20), / * Mot de passe administrateur * / Pass Varchar (20)); / * ============================================================================================================. =================================================================================================================================. =================================================================================================================================. ===================================================================================================================================. false, / * clé étrangère, qui gère cette catégorie * / account_id int, Contrainte Aid_fk Key Foreign (account_id) références compte (id));
Il y a principalement deux tables, le tableau de catégorie de produits et le tableau administrateur, et un tableau administrateur associé à la clé étrangère est fourni dans le tableau des catégories de produits. C'est-à-dire que le produit et l'administrateur sont une relation plusieurs à un. Maintenant, nous commençons à rédiger des informations de catégorie pour les produits de requête, et nous avons besoin d'un administrateur en cascade.
1. Implémentez la méthode de requête en cascade
Tout d'abord, définissez cette méthode dans l'interface CatégoryService:
Interface publique CategoryService étend BaseService <Catégorie> {// Informations sur la catégorie de requête, Administrateur en cascade Liste publique <Catégorie> QueryJoinAccount (type de chaîne); // interroge avec le nom de la catégorie} Ensuite, nous mettons en œuvre cette méthode dans la classe d'implémentation CatégoryServiceImpll de catégorieService:
@Service ("CatégoryService") classe publique CatégoryServiceImpl étend BaseServiceIMPL <catégories> implémente catégorieService {@Override public list <catégories> QueryJoinAccount (String Type) {String hql = "From category c where c.type like: type"; return getSession (). CreateQuery (HQL) .SetString ("type", "%" + type + "%"). list (); }} Parmi les deux modèles, nous attribuerons un lien à l'annotation:
// @ManyToOne (fetch = fetchtype.eager) @joincomn (name = "account_id") Compte public getAccount () {return this.account; } // @Onetomany (Cascade = CascadeType.all, fetch = fetchType.lazy, mappedBy = "Account") public set <Catégory> getCategories () {return this.categories; } Ensuite, nous le testons dans la classe de test:
@Runwith (SpringJunit4ClassRunner.class) @ContextConfiguration (locations = "classpath: beans.xml") Catégorie de classe publiqueServiceImplTest {@Resource Private CatégoryService categoryService; @Test public void testQueryJoinAccount () {for (catégorie C: catégorieService.QueryJoinAccount ("")) {System.out.println (c); System.out.println (c.getAccount ()); }}} 2. Problèmes avec les requêtes en cascade
Si nous regardons la sortie de la console, nous pouvons voir qu'il a envoyé plus d'une instruction SQL, mais nous ne l'avons interrogé une seule fois, alors pourquoi envoyons-nous autant de déclarations? C'est le problème commun 1 + n. Le soi-disant problème 1 + n consiste d'abord à publier une instruction pour interroger l'objet actuel, puis publier n instructions pour interroger l'objet associé, de sorte que l'efficacité devient très faible. Il n'y a que deux objets ici. S'il y a plus d'objets, l'efficacité sera considérablement réduite. Comment devrions-nous résoudre ce problème?
Peut-être que vous penserez que si vous définissez Fetch pour générer fetchType.lazy, vous ne publierez pas plusieurs instructions, mais ce n'est certainement pas possible, car après l'avoir configuré sur paresseux, nous ne pouvons pas obtenir l'objet de compte. La meilleure solution consiste à rédiger la déclaration HQL nous-mêmes et à utiliser Rejoing Fetch. Pour plus de détails, consultez la classe de mise en œuvre de catégorieServiceImpl modifiée:
@Service ("CatégoryService") Classe publique CatégorieServiceImpl étend BaseServiceImpl <catégories> implémente catégorieService {@Override public list <catégories> queryjoinAccount (Type de chaîne) {String hql = "de catégorie C Left Left join fetch C.Account Where C.Type Like: Type"; return getSession (). CreateQuery (HQL) .SetString ("type", "%" + type + "%"). list (); }} La gauche de gauche signifie la question avec le compte, la récupération des moyens d'ajouter l'objet de compte à la catégorie, de sorte qu'une seule instruction SQL sera envoyée et que la catégorie renvoyée contient également l'objet de compte.
3. Complétez la fonction de pagination
La pagination en hibernate est très simple. Il vous suffit d'appeler deux méthodes SetFirStResult et SetMaxResults: modifions l'interface CatégoryService et sa classe d'implémentation catégorieServiceImpl:
// CatégorieService Interface publique CatégorieService étend BaseService <catégories> {// Informations sur la catégorie de requête, Administrateur en cascade Liste publique <catégories> QueryJoinAccount (Type de chaîne, page int, taille int); // et mettre en œuvre la pagination} // catégorieServiceImpl @Service ("CatégoryService") classe publique CatégoryServiceImpl étend BaseServiceImppl <Catégory> Implementation CatégoryService {@Override Public List <Catégory> QueryjoinAntcount (String Type, int Page, int size) {String hql = "de catégorie C return getSession (). CreateQuery (HQL) .SetString ("type", "%" + type + "%") .setFirStResult ((page-1) * taille) // Show .SetMaxResults (taille) // affiche plusieurs .List (); }} Tessons-le dans la classe de test:
@Runwith (SpringJunit4ClassRunner.class) @ContextConfiguration (locations = "classpath: beans.xml") Catégorie de classe publiqueServiceImplTest {@Resource Private CatégoryService categoryService; @Test public void testQueryJoinAccount () {for (catégorie C: catégorieService.QueryJoinAccount ("", 1,2)) {// Affiche la première page, 2 éléments de données par page System.out.println (C + "," + C.GetAccount ()); }}} À cette fin, nous avons fini d'écrire la méthode de service et terminé les fonctions de requête en cascade et de pagination des catégories de produits.
(Remarque: En fin de compte, je fournirai le téléchargement du code source de l'intégralité du projet! Tout le monde est le bienvenu pour collecter ou partager)
Adresse originale: http://blog.csdn.net/eson_15/article/details/51320212
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.