2011-01-19 47 views
16



Una simple pregunta:
En este ejemplo, necesito recuperar todos los objetos, pero estos objetos deben tener campos distintos msgFrom.
Cuando usoHQL: Cómo seleccionar todas las entidades distintas de alguna columna?

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

me sale error siguiente:

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

supongo que es porque Hibernate recupera sólo una columna, pero necesito un objeto, no la columna.
¿Cómo puedo hacer esto?
Creo que solo puedo desplazarse por una coma, es decir

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

Pero lo que si tengo más de 20 campos de aquí? hay una solucion facil?

Gracias!

Respuesta

15

A continuación se muestra la consulta de ejemplo:

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

Alternativamente, también puede utilizar los criterios del API.

+0

Muchas gracias, realmente funciona !!!! – gennad

+0

¿Pero hay algún ejemplo de cómo hacerlo usando Criteria API? – gennad

+1

Cómo la API Criteria crea consultas dinámicas y reduce fallas en tiempo de ejecución - http://www.ibm.com/developerworks/java/library/j-typesafejpa/ –

23

También puede utilizar criterios y proyección juntos:

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

espero que ayude a alguien.

+0

Gracias. ¿Y qué pasa si desea que el resultado incluya toda la clase de mensaje con todo su conjunto de propiedades? –

4

probar esto, que trabajó para mí:

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

HQL no SQL .... –

0

tengo una respuesta para Hibernate Query Language utilizar campos distintos. Puede utilizar . Si usa una consulta SQL, devuelve la lista de cadenas. No puede usarlo para devolver el valor por clase de entidad. Entonces la respuesta para resolver ese tipo de problema es usar 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)"; 

De instrucción de consulta SQL que tiene DISTINCT ROUTE_ID y la entrada en una lista. Y en consulta filtrado del TO_CITY distinta de IN (Lista).

El tipo de devolución es del tipo Entity Bean. Entonces puedes hacerlo en AJAX como AutoComplement.

todos sean OK

5

criterios Hibernate es bastante fácil para seleccionar distintos resultados. Si desea solo resultado para ser devuelto en el resultado proyectado, es posible que desee utilizar:

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

Si desea que el resultado de incluir toda clase de mensaje con todo su conjunto de propiedades, puede utilizar Hibernate resultado del transformador,

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

Pero se filtra en función de la entidad raíz.

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(); 

Según su primera solución de la pregunta da salida correcta.

Cuestiones relacionadas