2011-01-19 21 views
16



Una domanda semplice:
In questo esempio ho bisogno di recuperare tutti gli oggetti, ma questi oggetti devono avere campi separati msgFrom.
Quando usoHQL: Come selezionare tutte le entità distinte per alcune colonne?

List<Message> list = getHibernateTemplate().find("select distinct m.msgFrom from Message m WHERE msgTo = ? AND msgCheck = 0", dinc); 

ottengo prossimo errore:

java.lang.ClassCastException: java.lang.Integer cannot be cast to com.example.model.Message 

suppongo che sia perché Hibernate recupera una sola colonna, ma ho bisogno di un oggetto, non colonna.
Come posso fare questo?
Penso che io posso solo scorrere una virgola, cioè

List<Message> list = getHibernateTemplate().find("select distinct m.msgFrom, m.To, m.datetime, .......... from Message m WHERE msgTo = ? AND msgCheck = 0", dinc); 

Ma cosa succede se ho più di 20 campi qui? C'è una soluzione facile?

Grazie!

risposta

15

riportano di seguito le query di esempio:

select e from Message e 
where e.msgFrom IN (select distinct m.msgFrom 
         from Message m 
         WHERE m.msgTo = ? 
         AND m.msgCheck = "0"); 

In alternativa, è anche possibile utilizzare criteri di API.

+0

Grazie mille, funziona davvero !!!! – gennad

+0

Ma ci sono degli esempi su come farlo usando l'API Criteria? – gennad

+1

In che modo l'API Criteria genera query dinamiche e riduce gli errori in fase di esecuzione - http://www.ibm.com/developerworks/java/library/j-typesafejpa/ –

23

È inoltre possibile utilizzare Criteri e proiezione insieme:

Criteria criteria = session.createCriteria(MyEntity.class); 
criteria.setProjection(Projections.distinct(Projections.property("id"))); 

La speranza è aiutare qualcuno.

+0

Grazie. E se si desidera che il risultato includa l'intera classe Messaggio con tutte le sue proprietà? –

4

Prova questa, ha funzionato per me:

SELECT FROM YourTableName 
WHERE somecolumnName=condition 
GROUP BY yourDistinctColumnName 
+1

HQL non SQL .... –

0

ho avuto una risposta per Hibernate Query Language di utilizzare campi distinti. È possibile utilizzare . Se si utilizza la query SQL, restituisce Elenco stringhe. Non è possibile utilizzarlo per restituire il valore per Entity Class. Quindi la risposta per risolvere quel tipo di problema è usare HQL con SQL.

"FROM FLIGHT_ROUTE F WHERE F.ROUTE_ID IN (SELECT SF.ROUTE_ID FROM FLIGHT_ROUTE SF GROUP BY SF.TO_CITY)"; 

Da istruzione di query SQL ha ottenuto DISTINCT ROUTE_ID e l'ingresso in una lista. E IN query filtro il distinto TO_CITY da IN (Elenco).

Il tipo di ritorno è di tipo bean di entità. Quindi puoi farlo in AJAX come AutoComplement.

tutti siano OK

5

criteri di Hibernate è abbastanza facile per selezionare i risultati distinti. Se si desidera singolo risultato da restituire nel risultato previsto, si possono usare colori:

Criteria criteria = session.createCriteria(Message.class); 
criteria.setProjection(Projections.distinct(Projections.property("msgFrom "))); 
List<String> msgFromList = criteria.list(); 

Se si desidera che il risultato di includere tutta la classe messaggio con tutto il suo insieme di proprietà, è possibile utilizzare Hibernate risultato Transformer,

Criteria criteria = session.createCriteria(Message.class); 
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
List<Message> messages = criteria.list(); 

Ma filtra in base all'entità radice.

O

Criteria criteria = session.createCriteria(Message.class); 

ProjectionList projection = Projections.projectionList(); 
projection.add(Projections.distinct(Projections.property("msgFrom"))); 
//Add as many columns as you want using Projection 
projection.add(Projections.property("msgTo")); 
criteria.setProjection(projection); 

criteria.setResultTransformer(Transformers.aliasToBean(Message.class)); 
List<String> msgFromList = criteria.list(); 

Come per la tua domanda prima soluzione dà uscita corretta.

Problemi correlati