Parlons de Critères Query, ce qui est facile pour les programmeurs américains qui ne connaissent pas très bien les déclarations SQL.
Sans plus tarder, jetons un coup d'œil à l'exemple:
La classe d'entité est la suivante:
La classe publique utilisateur implémente Serializable {private static final long SerialVersionUID = 1l; Public Long Id; nom de chaîne privé; Âge privé; // omettre la méthode get / set} Nous n'écrivons pas le fichier de mappage, c'est une entité très simple. Si vous ne comprenez pas les chaussures pour enfants, veuillez vous référer à mes autres articles dans la catégorie Hibernate.
Ensuite, voyons comment utiliser les critères pour interroger:
public static void main (String [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = cfg.BuildSessionFactory (); Session Session = SessionFactory.OpenSession (); Critères critères = session.CreateCriteria (user.class); critères.add (restrictions.eq ("nom", "shun")); List list = critères.list (); Iterator iter = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName () + ":" + user.getage ()); } session.close (); } En voyant le code, c'est une chaîne très simple.
Nous connaissons tous les précédents et nous voyons le code après la construction de la session:
Critères critères = session.CreateCriteria (user.class); critères.add (restrictions.eq ("nom", "shun")); Ces deux phrases de code sont les points clés. Analyons ce que cela signifie exactement?
Dans la première phrase, nous obtenons un objet de la classe de mise en œuvre des critères via la session, et dans la deuxième phrase, nous ajoutons une condition via la méthode ADD, et Eq représente l'égalité. HiberNate3 a déjà été implémenté via l'expression.eq. Après 3, puisque les critères ont été abandonnés, nous avons utilisé la classe de restrictions pour la mettre en œuvre, ce qui est la même que l'expression. Regardons l'API et constatons que l'expression hérite des restrictions.
Pour en revenir à nos deux phrases ci-dessus, après avoir terminé ces tâches, Hibernate nous a en fait aidés à construire similaire
Sélectionnez * à partir de l'utilisateur où name = 'shun'
Une telle déclaration. (Ici, la table correspondant à la classe utilisateur dans notre fichier de mappage est la table utilisateur, et l'attribut de nom correspond au champ de nom)
Les restrictions ont également de nombreuses méthodes pour nous aider à construire des instructions SQL. Il est facile à comprendre après avoir vérifié l'API.
Replovons le code ci-dessus. Si nous fermons la session, mais que nous voulons continuer à utiliser ces critères, est-ce OK? Jetons un coup d'œil.
Après le code ci-dessus, nous redimensions, ajoutant:
List list2 = critères.list (); Iterator iter2 = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName () + ":" + user.getage ()); } Afin de distinguer la différence entre la liste précédente et ITER, nous en utilisons un autre ici.
Exécutez-le et nous obtenons une exception:
org.hibernate.SessionException: la session est fermée!
La déclaration de cette exception signifie que la session a été close. Dans de nombreux cas, nous signalerons des exceptions similaires après la fermeture de la session, puis effectuer des opérations liées à SaveorUpdate, Save, etc.
HiberNate3 prend en compte nos besoins et met en œuvre une critère détachée, qui peut exister indépendamment de la session.
Jetons un coup d'œil à l'exemple: (entité ou ce qui précède)
public static void main (String [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = cfg.BuildSessionFactory (); Session Session = SessionFactory.OpenSession (); DetetachedCriteria Denmitria = DetetachedCriteria.ForClass (user.class); Denmiteria.add (restrictions.eq ("nom", "shun")); List list = décriteria.getExecuableCriteria (session) .list (); Iterator iter = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName () + ":" + user.getage ()); } session.close (); Session Session2 = SessionFactory.OpenSession (); List list2 = décriteria.getExecuableCriteria (session2) .list (); Iterator iter2 = list2.Iterator (); while (iter2.hasnext ()) {user user = (user) iter2.next (); System.out.println (user.getName () + ":" + user.getage ()); }} Nous constatons qu'après la fermeture de la session, nous pouvons continuer à utiliser des critères de détachement dans une autre connexion. Nous devons associer les critères détachés actuels avec une certaine session via GetExecuableCriteria (session de session).
Ensuite, jetons un coup d'œil à la combinaison de la classe des sous-requêtes et des critères détachés:
public static void main (String [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = cfg.BuildSessionFactory (); Session Session = SessionFactory.OpenSession (); DetetachedCriteria Denmitria = DetetachedCriteria.ForClass (user.class); Denteria.setProjection (projections.AVG ("âge")); Critères critères = session.CreateCriteria (user.class); critères.add (sous-questionnées.propertygt ("âge", diminateria)); List list = critères.list (); Iterator iter = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName () + ":" + user.getage ()); } session.close (); } Je suppose que la première phrase de code dont vous avez des questions:
Denteria.setProjection (projections.AVG ("âge")); Ce code fait référence à l'obtention de la valeur moyenne de l'âge par le biais de décritéria. Obtenez ensuite l'objet avec un âge supérieur à la valeur moyenne ci-dessous.
Les projections contient de nombreuses méthodes d'encapsulation qui implémentent les méthodes SQL. Vous pouvez jeter un œil à l'API.
Apprenons son utilisation légèrement plus avancée.
Regardez simplement le code:
critères.SetFirstresult (10); critères.SetMaxResults (20);
Ici, nous définissons l'enregistrement de début en tant qu'article 10, puis trouvons 20 enregistrements de l'article 10. Selon cette pratique, nous pouvons implémenter la fonction de pagination de base.
Bien sûr, nous avons besoin de tri dans de nombreux cas et les critères le soutiennent également:
critères.
Ici, nous pouvons utiliser directement la méthode de l'addition et obtenir un objet d'ordre via Order.desc, qui nécessite un paramètre d'attribut. En fait, lorsque nous appelons addosser, Hibernate nous aidera à générer une commande par âge, une telle déclaration.
Comment faisons-nous cela lorsque nous devons le regrouper? Cela nécessite la méthode GroupProperty de la classe de projections que nous avons mentionnée la dernière fois.
critères.SetProjection (projections.groupproperty ("âge")); Ici, nous nous regroupons selon l'attribut d'âge, qui est en fait regroupé à travers l'âge de terrain correspondant à l'âge. Hibernate le convertira automatiquement en une déclaration comme Group By Age.
Il existe de nombreuses méthodes pratiques dans les projections (notez que cela n'est disponible qu'après Hibernate 3).