Bonjour à tous,
j'ai actuellement un problème avec hibernate. Voici mon code :
Ce que je souhaite faire c'est à partir d'une requête SQL (dont je ne connais pas à l'avance les colonnes de sortie) itérer sur celle-ci, sachant que cette requête retourne potentiellement des millions d'enregistrements. Je souhaite au passage récupérer le nom des colonnes de la clause select (ou les alias)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 public static void executionRequete (String sql) { StatelessSession session = sessionFactory.openStatelessSession(); Transaction transaction = null; try { transaction = session.beginTransaction(); SQLQuery query = session.createSQLQuery(sql); query.setResultTransformer( new ResultTransformer() { @Override public Object transformTuple(Object[] result, String[] strings) { return Arrays.asList(result); } @Override public List transformList(List list) { return list; } } ); //query.list(); ScrollableResults sr = query.scroll(ScrollMode.FORWARD_ONLY); while (sr.next() ) { Object[] os = sr.get(); } transaction.commit(); } catch (Exception e) { if (transaction != null) { transaction.rollback(); } System.out.println(e); } finally { session.close(); } }
Lorsque l'on utilise la méthode scroll(), cela itère bien comme je le souhaite mais je récupère uniquement les données de chaque enregistrement et pas les alias des colonnes.
J'ai tenté d'utiliser un ResultTransformer mais cela ne fonctionne pas. En effet (en mode débogage) dans la méthode transformTuple() du ResultTransformer, le paramètre strings (contenant le nom des colonnes normalement) est vide lorsque l'on utilise le scroll hibernate (mais pas le paramètre result). Par contre, si j'utilise la méthode list(), je récupère correctement le paramètre strings (et l paramètre result) et je peux donc récupérer le nom des colonnes.
Bien sûr, je suis obligé d'utiliser le scroll à cause du nombre potentiellement élevé d'enregistrements retournés par ma requête...
Comment fait-on pour récupérer le nom des colonnes ? Scrolling et ResultTransformer ne sont-ils pas pleinement utilisables ensemble ?
J'ai bien une autre idée, passer en mode "bas niveau", c'est à dire récupérer la connection JDBC avec la méthode doWork de la classe Session puis exécuter ma requête (prepared statement...) et utiliser la méthode ResultSetMetaData pour le nom des colonnes. Mais je trouve ça très lourd pour un problème qui me semble si simple !
Avez-vous des idées ?
Partager