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;
}