2013-01-12 6 views
5

Sto scrivendo un'app Java che utilizza Hibernate per ottenere i dati, nella mia app ho un'area di testo di input che accetta una stringa di comando sql digitata dall'utente e l'esecuzione tramite Hibernate per ottenere qualsiasi dato l'utente interroghi, quindi non so in anticipo quale potrebbe essere la tabella dei risultati e quindi non conosco i nomi delle colonne, ma ho bisogno di visualizzare i risultati della query utente in una tabella con i nomi delle colonne relativi ai campi dati, come ottenerli in Hibernate? Ho provato il seguente codice:Come ottenere i nomi delle colonne dal risultato della query Hibernate in Java?

Session session=HibernateUtil.getSession(); 
    session.beginTransaction(); 
    Query q=session.createQuery(hql); 

    AliasToEntityMapResultTransformer INSTANCE=new AliasToEntityMapResultTransformer(); 
    q.setResultTransformer(INSTANCE); 
    List<Map<String,Object>> aliasToValueMapList=q.list(); 

    for (Map<String,Object> map : aliasToValueMapList) 
    for (Map.Entry<String,Object> entry : map.entrySet()) System.out.println(entry.getKey()+" - "+entry.getValue()); 

Mi ha dato il seguente messaggio di errore: Exception in thread java.lang.ClassCastException "AWT-EventQueue-0": sakila.entity.Actor non può essere lanciato a Java. util.Map

Punta al primo ciclo for, poiché sono nuovo di Hibernate, non so se è fattibile in esso, come correggere il codice precedente? Qualcuno potrebbe mostrarmi un codice di esempio che funzioni nel mio caso?

Modifica: Come Marcel Stör menzionato di seguito, devo essere in grado di consentire a entrambe le situazioni di accadere e non limitare la capacità degli utenti di interrogare qualsiasi dato, qual è il modo migliore per farlo?

risposta

1

Io non capisco, ma ancora il coraggio di rispondere ...

Se si utilizza HQL come questo Query q=session.createQuery(hql); suggerisce torni oggetti e non i singoli campi per impostazione predefinita. Ciò significa che sei sfortunato comunque cercando di mappare i risultati alla query, MA puoi semplicemente usare i nomi dei campi dell'oggetto come nomi di colonne.

Se ciò che si ottiene dall'area di testo è semplicemente SQL, è necessario utilizzare session.createSQLQuery(sql). Quello che ottieni è un list of object arrays. Tuttavia, anche qui ottieni solo i dati. Dovresti vietare ai tuoi utenti di utilizzare le query select *. Quindi è possibile utilizzare il nome del campo/colonna nella query come i nomi delle colonne di output.

0

L'utente inserisce la query SQL o HQL? C'è una grande differenza tra quelli.

Se l'utente digita nella query HQL, è possibile chiamare hqlQuery.getReturnTypes() e quindi per ogni tipo è possibile fare whatever suggested in this post per scoprire i metadati della tabella.

0

io ho lo stesso tipo di problema per la query HQL come

select new Map(id as id, name as name) from Person 

che uso come vista DTO

Con uno o più record posso scorrere la mappa che è elemento di List<Map<String, Object> . Il problema solo quando devo gestire la situazione con dataset vuoto. Per quel caso qualcosa come

public List<String> getAliases(String queryString) { 
    ArrayList<String> list = 
     new ArrayList<String>(Arrays.asList(queryString.split("as "))); 
    List<String> result = new ArrayList<String>(); 
    list.remove(0); 
    for (String str : list) { 
     StringTokenizer st = new StringTokenizer(str, ",) "); 
     result.add(st.nextToken()); 
    } 
    return result; 
}