SYS:ONLINE/PUBLICATIONS
BELGIQUE 🇧🇪/CLEARANCE:PUBLIC
RSS
JF FAFCHAMPSsMug@replicatorbe
~/Publications/Développement/hibernate-recuperer-les-colonnes-par-leur-nom-en-sql-natif

Hibernate : récupérer les colonnes par leur nom en SQL natif

Développement / /2 min de lecture

Migrer une couche DAO maison vers Hibernate sans tout réécrire : garder le SQL natif pour les requêtes compliquées, et récupérer chaque colonne par son nom plutôt qu'un tableau d'objets anonymes.

Note ajoutée depuis : la requête de cet exemple (partie, joueur, config, un classement des cinq meilleurs temps) vient de MasterMind GUI, mon jeu en Java écrit pour les cours. Six semaines plus tard, le même projet me valait un autre piège Hibernate. Le schéma qui illustrait ce billet n'a pas survécu aux migrations.

Actuellement, je suis dans la conversion d'un programme Java (avec couche DAO) en remplaçant celle-ci par une couche DAO Hibernate.

Pour migrer en douceur, j'utilise (pour les requêtes les plus compliquées) le SQL natif.

En temps normal, vous exécutez :

List donnee = session.createSQLQuery("select * from votre requete");

Nous obtenons en retour une liste d'objets. C'est parfois embêtant…

Il est parfois (souvent ?) utile d'obtenir une liste contenant les objets rangés. Lorsqu'il est possible de réaliser cela, il est simple de récupérer les données basées sur le nom de colonne.

Un exemple de code :

public String scorefinal2() {
    String queryString = "select nom,temp,nbrecolonne,nbrecouleur,nbreligne from partie, config,joueur where partie.confid=config.idconfig and joueur.id=partie.joueur_fk and partie.resultat = 2 order by 2 asc LIMIT 5";
    String pseudo = "";
    String score = "";
    String nombreColonne = "";
    String nombreCouleur = "";
    String nombreLigne = "";

    Session session1 = HibernateFactory.getSession();
    session1.beginTransaction();
    List data = session1.createSQLQuery(queryString)
            .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
            .list();
    session1.getTransaction().commit();

    for (Object object : data) {
        Map row = (Map) object;

        pseudo += row.get("nom") + "/";
        score += row.get("temp") + "/";
        nombreColonne += row.get("nbrecolonne") + "/";
        nombreCouleur += row.get("nbrecouleur") + "/";
        nombreLigne += row.get("nbreligne") + "/";
    }

    return pseudo + score + nombreColonne + nombreCouleur + nombreLigne;
}