Dans cet article


Offres d'emploi

Tags

Le multiselect avec Hibernate 4

Le multiselect avec Hibernate 4

Nous avons vu dans l’article « Les requêtes avec Hibernate 4 » comment réaliser une requête ramenant soit un champ soit tous les champs (SELECT *). Voyons à présent comment ramener plusieurs champs mais pas tous.

Le code côté Hibernate

Pour ce faire, nous avons recours à la fonction multiselect() de la classe CriteriaQuery. Cette fonction prend en paramètres soit une List de champs, soit n paramètres représentant des champs ou des fonctions.

Par exemple, si je souhaite récupérer une liste des noms et prénoms des utilisateurs d’une application, je pourrais avoir le code suivant :

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<
Tuple> criteriaQuery = builder.createQuery(Tuple.class);
Root<
Utilisateur> root = criteriaQuery.from(Utilisateur.class);
criteriaQuery.multiselect(root.get(Utilisateur_.nom), root.get(Utilisateur_.prenom));
TypedQuery<
Tuple> typedQuery = entityManager.createQuery(criteriaQuery);
List<
Tuple> result = typedQuery.getResultList();

Ici, on peut constater que le type de la CriteriaQuery ainsi que celui de la TypedQuery est javax.persistence.Tuple. En effet, étant donné que nous effectuons une sélection de champs customisée, cela ne correspond à aucune Entity mappée par Hibernate. On récupérera donc une liste de Tuple qui, comme leur nom l’indique, contiennent chacun autant de valeurs que l’on en a spécifié dans le multiselect.

L’exploitation des résultats

Nous avons à présent une liste de Tuples dont nous souhaitons extraire les données. En reprenant l’exemple précédent, mettons que je souhaite à présent construire une liste de String dont les éléments sont la concaténation du prénom et du nom des utilisateurs trouvés. On peut donc avoir le code suivant :

List<
Tuple> utilisateurs = new ArrayList<
Tuple>();
StringBuilder builder = null;
for(Tuple tuple:result) {
    if(tuple != null) {
        builder = new StringBuilder();
        if(tuple.get(1) != null) {
            builder.append((String)tuple.get(1));
        }
        if(tuple.get(0) != null) {
            if(builder.length() > 0) {
                builder.append(" ");
            }
            builder.append((String)tuple.get(0));
        }
        if(builder.length() > 0) {
            utilisateurs.add(builder.toString());
        }
    }
}

Vous constaterez qu’il est nécessaire de caster chaque valeur récupérée, la méthode get(int) de Tuple retournant un Object. Une variante consiste à passer la classe désirée en paramètre : c’est alors la méthode get(int, Class) qui se charge de réaliser le cast. De plus, on ne saurait trop conseiller de tester la nullité de chaque valeur : en effet, ce n’est pas parce que get(0) ne propage pas d’ArrayIndexOutOfBoundException qu’il ne renvoie pas null.

L'équipe AXOPEN

Voir aussi les articles suivants

Les requêtes avec Hibernate 4

Les requêtes avec Hibernate 4

Le 02/10/2013 par Florent Tripier

Hibernate 4 propose une syntaxe structurée qui permet d’exploiter la plupart des fonctionnalités du SQL. Cette syntaxe s’articule autour de quelques classes clés. Les classes clés pour construire une requête EntityManager L’EntityManager vous donne accès à votre PersistenceUnit, c’est-à-dire à votre base de données. C’est donc à partir de lui que seront construits tous les objets suivants. La configuration de la PersistenceUnit fera l’objet d’un autre article. CriteriaBuilder Le CriteriaBuilder est généré par l’EntityManager.
Lire l'article

Hibernate et la LazyInitializationException

Hibernate et la LazyInitializationException

Le 12/09/2013 par Florent Tripier

Les développeurs utilisant Hibernate sont tôt ou tard amenés à se heurter à sa fameuse LazyInitializationException. Voyons dans quelles circonstances elle est levée et comment l’éviter définitivement. Pourquoi la LazyInitializationException ? Pour les victimes de la LazyInitializationException, les raisons de sa propagation sont souvent obscures et ils ont tendance à imaginer que son apparition est plus ou moins aléatoire. Il n’en est pourtant rien. Contexte : le lazy loading La <span .
Lire l'article

HaProxy: JBoss EAP 6.1 et MySql Réplication

HaProxy: JBoss EAP 6.1 et MySql Réplication

Le 28/08/2013 par Florent Tripier

Lors de l’utilisation de HAPROXY vers deux Mysql en master/slave, lors de l’arrêt d’un des deux serveurs Mysql, le serveur JBoss n’arrive pas à se reconnecer à la base de données. Etudions ici la configuration, l’installation de Haproxy et de JBoss. Versions utilisées: JBoss EAP 6.1 Mysql 5.5 Configuration de HAPROXY Dans cette configuration, nous utilisons une réplication entre un Mysql Master et un Slave. L’idée est d’avoir un failover lors de la chute du master vers le server de backup, ici le 192.
Lire l'article