2.1 Introduction aux classes Query

Soit dit en passant, un autre point important est la classe d'assistance Query. Vous pouvez le voir dans cet exemple :

public List<Employee> getAllEmployes() {
    try (Session session = sessionFactory.openSession()) {
            Query<Employee> query = session.createQuery("from Employee", Employee.class);
            return query.list();
    }
}

En fait, Query est une interface et il a plusieurs implémentations pour différents cas. Mais pour plus de simplicité, je continuerai à l'appeler une classe. Il s'agit, disons, d'une classe au sens large - en termes de POO.

Note. Avant, il y avait deux classes :

  • Requête pour décrire la requête.
  • TypedQuery pour décrire une requête avec un type connu.

Le premier est apparu quand Hibernate existait déjà, et il n'y avait pas encore de génériques. Puis, après la sortie du JDK 5, une autre classe a été ajoutée à Hibernate - TypedQuery, qui prenait déjà en charge le typage du résultat de la requête.

Mais, pour autant que je m'en souvienne, à partir de la 5e version d'Hibernate, il ne restait qu'une seule classe typée, et elle s'appelle maintenant Query.

La méthode standard pour créer une requête est la suivante :


Query<Employee> query = session.createQuery("from Employee", Employee.class);

Vous avez appris à créer des objets Query, mais comment exécutez-vous ces requêtes ?

C'est encore plus simple ici - nous appelons simplement la méthode list() sur l'objet Query :


Query<Employee> query = session.createQuery("from Employee", Employee.class);
List<Employee> resultLіst = query.list();

La méthode list() a un synonyme JPA, une méthode qui fait la même chose mais qui s'appelle getResultList() . Vous pouvez parfois le voir dans le code écrit par d'autres programmeurs.

En passant, si la requête implique que le résultat sera dans un seul résultat, il est alors plus simple d'utiliser la méthode uniqueResult() pour appeler la requête .


Query<Employee> query = session.createQuery("from Employee where id = 1", Employee.class);
Employee result = query.uniqueResult();

La méthode uniqueResult() a un synonyme JPA, la méthode singleResult() . Il a été introduit pour la compatibilité d'Hibernate avec la norme JPA. Il fait exactement la même chose.

2.2 Méthodes de classe de requête

En fait, la classe Query a beaucoup de méthodes différentes. Ci-dessous, je parlerai de trois autres d'entre eux.

La première est la méthode stream() . Et son synonyme JPA getResultStream() .

Ces deux méthodes renvoient un flux de données au lieu d'une liste. Cette approche peut être très efficace lorsque vous n'avez pas besoin de tous les objets obtenus à la suite d'une requête à la fois. Ou il est possible que seul le premier d'entre eux soit utilisé.

Exemple:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
Stream<Employee> stream = query.stream();

La deuxième méthode est la méthode executeUpdate() . Vous pouvez écrire une requête qui changera quelque chose dans la base de données. Dans ce cas, il est nécessaire qu'Hibernate n'utilise pas de transaction en lecture seule lors de l'accès à la base de données.

Exemple de requête : nous avons décidé d'augmenter le niveau de tous les utilisateurs de 1.


Query<User> query = session.createQuery("update User set level=level+1", User.class);
int count = query.executeUpdate();

La méthode executeUpdate() renverra le nombre de lignes réellement modifiées.

Et enfin la troisième méthode est scroll() . Nous vous en dirons un peu plus.

2.3 Méthodes de la classe Scroll

Cette méthode est quelque peu similaire à la méthode stream() . Seulement, cela vous permet de vous déplacer dans la liste des résultats sans extraire les résultats du tout. Autrement dit, vous pouvez exécuter une requête, puis la faire défiler jusqu'à la millionième ligne du résultat et commencer à lire les données à partir de là.

Un tel itérateur avancé.


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();

L' objet ScrollableResults possède les méthodes suivantes :

Méthode Description
R obtenir() Renvoie l'élément courant
suivant() Déplace le pointeur vers l'élément suivant
précédent() Déplace le pointeur vers l' élément précédent
défilement (taille int) Faites défiler vers l'avant par lignes de taille
position(int pos) Fait du numéro de position de l'élément l'élément actuel
dernier() L'élément courant est maintenant le dernier
d'abord() L'élément courant est maintenant le premier
getRowNumber() Renvoie le numéro de la ligne actuelle
setRowNumber() Définit le numéro de ligne actuel

Supposons que vous ayez exécuté une requête et que vous souhaitiez obtenir le dernier élément. Voici comment procéder :


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();
scroll.last();
Employee lastEmployee = scroll.get();