2012-05-24 19 views
12

En mi base de datos tengo una tabla de prueba, con columnas: testName, testType hay 2 pruebas diferentes con el mismo tipo Ie "SUN", por lo que solo quiero una para la que use Distinct en mi hibernación/criterio como se muestra a continuación, pero todavía me da los dos tipos con el mismo nombre que "sun".Cómo agregar Distinct en los criterios de Hibernate

 Criteria crit = session.createCriteria(Test.class); 

    final ResultTransformer trans = new DistinctRootEntityResultTransformer(); 
    crit.setResultTransformer(trans); 
    List rsList = trans.transformList(crit.list()); 

Cualquier idea de cuál podría ser el motivo o cualquier otra forma de filtrar duplicados.

Respuesta

22

Use Projections.distinct.

Criteria crit = session.createCriteria(Test.class).setProjection(
    Projections.distinct(Projections.projectionList() 
    .add(Projections.property("type"), "type")) 
.setResultTransformer(Transformers.aliasToBean(YourBean.class)); 

List lst = crit.list(); 

donde YourBean.class tiene una propiedad "tipo". La lista devuelta será List<YourBean>.

+0

gracias, ahora está dando el resultado correcto, pero tiene la forma de una cadena después de esta declaración, mientras que quiero el objeto completo y devuelvo el objeto completo, también quiero el valor del nombre de prueba, ¿cómo puedo obtener ese – user1226162

+0

He editado la respuesta para devolver la Lista de objetos. – Dandy

+5

@Dandy, buena respuesta, pero sigo teniendo un problema. El bean que obtengo contiene solo "tipo". Otras propiedades de la clase Test tienen valores nulos o 0. ¿Cómo puedo obtener esos valores junto con la restricción de tipo único? – RAS

1

Tuve el mismo problema y terminé solucionando usando la proyección Agrupar por y luego agregué todas las columnas que necesitaba. Por ejemplo

Criteria query = session.createCriteria(Class.class) 
    .setProjection(Projections.projectionList() 
     .add(Projections.groupProperty("Col1"), "Col1") 
     .add(Projections.groupProperty("Col2"), "Col2")) 
    .setResultTransformer(Transformers.aliasToBean(Class.class)); 
List list = query.list(); 
4

por fin he encontrado a cabo para obtener los valores de otras columnas:

Criteria criteria = session.createCriteria(Test.class); 
ProjectionList projectionList = Projections.projectionList(); 
ProjectionList projectionList2 = Projections.projectionList(); 
projectionList2.add(Projections.distinct(projectionList.add(Projections.property("distinctColumn"), "distinctColumn"))); 
projectionList2.add(Projections.property("col1"), "col1"); 
projectionList2.add(Projections.property("col2"), "col2"); 
criteria.setProjection(projectionList2); 
criteria.setResultTransformer(Transformers.aliasToBean(Test.class)); 
List list = criteria.list(); 
10

Trate de usar:

cr.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 

que funcione perfectamente para mí

+1

¿Puede agregar más información sobre por qué funcionó para usted? –

+0

Una gran respuesta, funcionó para mi caso también en solo 1 línea adicional (en lugar de 10 ...) – argh

+2

Esta es una solución bastante limitada. Al utilizar ResultTransformer, hibernate no incluye DISTINCT en la consulta SQL, por lo que tenemos problemas con la paginación (límite/desplazamiento) – Eugene

0

intenta utilizar:

Criteria criteria = 
    session.createCriteria(Test.class).setProjection(
     Projections.distinct(Projections.property("testType"))); 
List<Test> rsList = criteria.list(); 
0

Try setResultTransformer (Criteria.DISTINCT_ROOT_ENTITY)

Criterio crit = session.createCriteria (Test.class); List list = crit.setResultTransformer (Criteria.DISTINCT_ROOT_ENTITY) .list();

Cuestiones relacionadas