[Débutant] Object[] récalcitrant ?

récalcitrant ? [Débutant] Object[] - Java - Programmation

Marsh Posté le 19-08-2005 à 10:10:48    

Bonjour,
 
Suite à mon post relatifs au résultats des requêtes hibernate : http://forum.hardware.fr/hardwaref [...] 5888-1.htm
J'ai pu grace à l'aide de Bartleby mieux cerner mon problème :
 
Comment récupérer des données de type String contenues dans un tableau de type Object[] ?
 
Voici le genre d'essais que j'effectue :

Code :
  1. List resultat = requete.list();  //je récupère un tableau de 2 colonnes
  2.      Object[] ligne = new Object[2];
  3.      ligne = (Object[]) resultat.get(0);
  4.      System.out.println((String)ligne[0]);


Cet essai me donne une OutOfBoundsException.
 
Merci de votre aide.
 
En prime la doc de la Methode Query::list() utilisée en ligne 1 ici.

Code :
  1. list
  2. public List list()
  3.           throws HibernateException
  4.     /*Return the query results as a List. If the query contains multiple results pre row, the results are returned in an instance of Object[].*/
  5.     Returns:
  6.         the result list
  7.     Throws:
  8.         HibernateException


Message édité par molmock le 19-08-2005 à 10:23:59
Reply

Marsh Posté le 19-08-2005 à 10:10:48   

Reply

Marsh Posté le 19-08-2005 à 10:27:16    

ben spa compliqué:
 

Code :
  1. ligne = (Object[]) resultat.get(0);


tu récupères un tableau de taille 0 vraissemblablement
 
NB: ton

Code :
  1. new Object[2];


ne sert à rien puisque juste après tu donnes une nouvelle valeur a ligne


Message édité par souk le 19-08-2005 à 10:27:27
Reply

Marsh Posté le 19-08-2005 à 10:33:27    

OK je teste

Reply

Marsh Posté le 19-08-2005 à 10:36:45    

Ca me donne ClassCastException, en ligne 2:

Code :
  1. List resultat=requete.list();
  2. Object[] ligne =(Object[]) resultat.get(0);
  3. System.out.println(ligne.length);


Message édité par molmock le 19-08-2005 à 10:37:50
Reply

Marsh Posté le 19-08-2005 à 11:21:28    

ben tu n'obtiens pas de Object[] [:spamafote]
 
ca te donne quoi ca:

Code :
  1. System.out.println(resultat.get(0).getClass());


 
?


Message édité par souk le 19-08-2005 à 11:22:07
Reply

Marsh Posté le 19-08-2005 à 11:25:11    

Ca me donne ça :
class [Ljava.lang.Object;

Reply

Marsh Posté le 19-08-2005 à 11:34:31    

[:mlc] et tu te prends une ClassCastException ??
c'est plus qu'étrange :/ tu récupères bien un Object[] ... [:ciler]

Reply

Marsh Posté le 19-08-2005 à 11:40:57    

Et de plus dans le debugger je vois bien les bonnes valeurs dans le tableau Résultat !!!????
 
Je recherche des exemples ou quelqu'un aurait réussit à récupérer des données d'hibernate sans que ça corresponde à des objets métiers, mais j'en trouve pas :cry:

Reply

Marsh Posté le 19-08-2005 à 11:42:58    

tu peux donner plus de code ? quelle requete tu fais, etc etc, qu'on puisse y voir plus clair ? paske bon la, on n'a pas grand chose à se mettre sous la dent :/

Reply

Marsh Posté le 19-08-2005 à 11:55:51    

Regarde sur le post que j'avais fait avant :
http://forum.hardware.fr/hardwaref [...] 5888-1.htm
 
Je remet le code ici avec les modifs :

Code :
  1. public static void main(String[] args) throws HibernateException, TechniqueException {
  2.          IDatabaseManager HDM = HibernateDatabaseManager.getInstance();
  3.          Session session=HDM.getSession();
  4.          Transaction tx = session.beginTransaction();
  5.          SQLQuery requete = session.createSQLQuery("select utinom,serlibelle " +
  6.                                              "from t_utilisateur u, t_service s " );
  7.          System.out.println(requete.list().size());// On vérifie bien que ca a marché
  8.          List resultat = requete.list();        //je récupère un tableau de 2 colonnes
  9.        
  10. // Transtypage incriminé :  
  11.          Object[] ligne =(Object[]) resultat.get(0);
  12.          System.out.println(ligne.length);
  13. //
  14.      
  15.          tx.commit();
  16.          HDM.getSession().close();
  17.      }


Message édité par molmock le 19-08-2005 à 12:00:09
Reply

Marsh Posté le 19-08-2005 à 11:55:51   

Reply

Marsh Posté le 19-08-2005 à 12:09:04    

et avec ca tu as quoi ? ClassCastException en ligne 15 ? si non, la ligne 16 t'affiche quoi ?

Reply

Marsh Posté le 19-08-2005 à 13:35:59    

J'essaie d'afficher le nombre d'éléments de la ligne mais comme ça plante avant ...

Reply

Marsh Posté le 19-08-2005 à 13:36:17    

En ligne 16 j'essaie d'afficher le nombre d'éléments de la ligne mais comme ça plante avant ...

Reply

Marsh Posté le 19-08-2005 à 13:39:31    

ca plante ? quelle Exception ?

Reply

Marsh Posté le 19-08-2005 à 13:39:47    

une ClassCastException ?

Reply

Marsh Posté le 19-08-2005 à 13:44:34    

La ligne 9 affiche quoi ?


---------------
Posté depuis des chiottes, sales. Me gusta.
Reply

Marsh Posté le 19-08-2005 à 13:49:06    

Euh non excuse moi, je me suis embrouillé dans mes sources, j'ai recompilé ce code, la ligne 15 passe, la ligne 16 renvoie 0 (les objets lignes sont vides).

Reply

Marsh Posté le 19-08-2005 à 13:49:31    

la ligne 9 affiche 735

Reply

Marsh Posté le 19-08-2005 à 13:54:42    

surement con comme idée, mais si tu remplaces ca:

Code :
  1. System.out.println(requete.list().size());
  2. List resultat = requete.list();


 
par ca:

Code :
  1. List resultat = requete.list();
  2. System.out.println(resultat.size());


 
? [:dawa]
 
(au pire ca t'evitera de faire 2 fois la requete [:joce] )

Reply

Marsh Posté le 19-08-2005 à 14:04:22    

Ok lol, c'est toujours ça de gagné.

Reply

Marsh Posté le 19-08-2005 à 14:11:54    

sinon, je me demande si a cause du lazy loading faut pas explicitement utiliser un iterateur sur la liste de resultats....

Reply

Marsh Posté le 19-08-2005 à 14:20:36    

J'ai essayé avec un itérateur :

Code :
  1. Iterator iter = requete.list().iterator();
  2.     while (iter.hasNext()) {
  3.         Object[] ligne = (Object[]) iter.next();
  4.         System.out.println(ligne.length);
  5.     }


 
Idem, que des lignes vides... :(

Reply

Marsh Posté le 19-08-2005 à 14:22:32    

poste le nouveau code avec le resultat des différents affichage en commentaire stp :o


---------------
Posté depuis des chiottes, sales. Me gusta.
Reply

Marsh Posté le 19-08-2005 à 14:31:13    

et ta requete elle marche bien ?
 
select utinom,serlibelle from t_utilisateur u, t_service s  
 
=> select u.utinom,s.serlibelle from t_utilisateur u, t_service s  
 
sinon ta requete je pense qu'elle va pas te donner de bons resultats de toute facon, faut peut etre songer a faire une jointure, pas uniquement un produit cartésien [:petrus75]

Reply

Marsh Posté le 19-08-2005 à 14:33:11    

Bah s'il dit avoir 735 ligne de resultat... [:spamafote]


---------------
Posté depuis des chiottes, sales. Me gusta.
Reply

Marsh Posté le 19-08-2005 à 14:37:15    

ben ouais mais que des lignes vides [:joce] donc peut etre que ca doit effectivement retourner des lignes vides ^^

Reply

Marsh Posté le 19-08-2005 à 14:39:01    

En fait ce bout de code est un morceau simplifié de la requête originale, le problème est de savoir comment récupérer des données renvoyées par hibernate sous forme de tableau (ici j'ai restreint à 2 colonnes).
 
boulax -> Voici le code :
 

Code :
  1. public static void main(String[] args) throws HibernateException, TechniqueException {
  2.                   IDatabaseManager HDM = HibernateDatabaseManager.getInstance();
  3.                   Session session=HDM.getSession();
  4.                   Transaction tx = session.beginTransaction();
  5.        
  6.                   SQLQuery requete = session.createSQLQuery("select utinom,serlibelle " +
  7.                                                       "from t_utilisateur u, t_service s " );
  8.                  
  9.                   List resultat = requete.list();     
  10.                   System.out.println(resultat.size()); //735
  11.                   Object[] ligne =(Object[]) resultat.get(0);
  12.                   System.out.println(ligne.length);  //0
  13.                
  14.                   tx.commit();
  15.                   HDM.getSession().close();
  16.     }


 
Résultat :

Code :
  1. Hibernate: select utinom,serlibelle from t_utilisateur u, t_service s
  2. 735
  3. 0

Reply

Marsh Posté le 19-08-2005 à 14:42:09    

souk a écrit :

ben ouais mais que des lignes vides [:joce] donc peut etre que ca doit effectivement retourner des lignes vides ^^


 
J'ai vu mes résultats dans le débugger (jusqu'à ce que je fasse une connerie dans Eclipse qui me balance une noClassDefFoundError des que je lance le debug )

Reply

Marsh Posté le 19-08-2005 à 14:43:23    

Ouais comme disais souk, y'a pas une erreur avec tes alias de table ?


---------------
Posté depuis des chiottes, sales. Me gusta.
Reply

Marsh Posté le 19-08-2005 à 14:49:51    

Non, y'a pas d'erreur, ce serait pareil si j'essayait avec un "select * from t_utilisateur", je ne pourrait pas récupérer les données sans faire le bon transtypage (cad : (Utilisateur)resultat.get(0)).

Reply

Marsh Posté le 19-08-2005 à 15:04:50    

Merci de votre aide les gars mais moi j'abandonne, j'ai encore d'autres pb à résoudre (et puis on sait jamais un éclair de génie ...)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed