Pregunta

Para hacerlo breve:¿Hibernate no admite proyecciones y consultas por ejemplo?Encontré esta publicación:

El código es este:

User usr = new User();
usr.setCity = 'TEST';
getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Example.create(usr))

Como decía el otro cartel, el sql generado sigue teniendo una clase donde se refiere solo y0_=?en lugar de this_.city.

Ya probé varios enfoques y busqué en el rastreador de problemas pero no encontré nada al respecto.

Incluso intenté usar el alias de Proyección y Transformers, pero no funciona:

User usr = new User();
usr.setCity = 'TEST';
getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Example.create(usr)).setResultTransformer(Transformers.aliasToBean(User.class));

¿Alguien ha utilizado proyecciones y consultas por ejemplo?

¿Fue útil?

Solución

¿Puedo ver tu clase de usuario?Esto es solo usar las restricciones a continuación.No veo por qué las Restricciones serían realmente diferentes de los Ejemplos (aunque creo que los campos nulos se ignoran de forma predeterminada en los ejemplos).

getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Restrictions.eq("city", "TEST")))
.setResultTransformer(Transformers.aliasToBean(User.class))
.list();

Nunca he usado alaistToBean, pero acabo de leer sobre él.También puedes simplemente recorrer los resultados.

List<Object> rows = criteria.list();
for(Object r: rows){
  Object[] row = (Object[]) r;
  Type t = ((<Type>) row[0]);
}

Si es necesario, puede completar manualmente el Usuario usted mismo de esa manera.

Es un poco difícil investigar el problema sin más información para diagnosticarlo.

Otros consejos

El problema parece ocurrir cuando tienes un alias con el mismo nombre que la propiedad del objeto.Hibernate parece tomar el alias y usarlo en SQL.encontré esto documentado aquí y aquí, y creo que es un error en Hibernate, aunque no estoy seguro de que el equipo de Hibernate esté de acuerdo.

De cualquier manera, encontré una solución sencilla que funciona en mi caso.Su experiencia puede ser diferente.Los detalles se encuentran a continuación. Intenté simplificar el código de este ejemplo, así que pido disculpas por cualquier error o errata:

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("sectionHeader", sectionHeaderVar)) // <- Problem!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

Produciría este sql:

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(y1_) like ? ) 

Lo que estaba provocando un error: java.sql.SQLExcepción:ORA-00904:"Y1_":identificador no válido

Pero, cuando cambié mi restricción para usar "esto", así:

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("this.sectionHeader", sectionHeaderVar)) // <- Problem Solved!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

Produjo el siguiente sql y mi problema se resolvió.

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(this_.SECTION_HEADER) like ? ) 

¡Eso es todo!Una solución bastante sencilla a un problema doloroso.No sé cómo se traduciría esta solución al problema de consulta por ejemplo, pero puede acercarlo más.

El verdadero problema aquí es que hay un error en hibernación donde usa alias de lista de selección en la cláusula donde:

http://opensource.atlassian.com/projects/hibernate/browse/HHH-817

En caso de que alguien llegue aquí buscando respuestas, mire el ticket.Se necesitaron 5 años para solucionarlo, pero en teoría estará en una de las próximas versiones y luego sospecho que el problema desaparecerá.

Estoy enfrentando un problema similar.Estoy usando Consulta por ejemplo y quiero ordenar los resultados por un campo personalizado.En SQL haría algo como:

select pageNo, abs(pageNo - 434) as diff
from relA
where year = 2009
order by diff

Funciona bien sin la cláusula de orden por orden.lo que tengo es

Criteria crit = getSession().createCriteria(Entity.class);
crit.add(exampleObject);
ProjectionList pl = Projections.projectionList();
pl.add( Projections.property("id") );
pl.add(Projections.sqlProjection("abs(`pageNo`-"+pageNo+") as diff", new String[] {"diff"}, types ));
crit.setProjection(pl);

Pero cuando agrego

crit.addOrder(Order.asc("diff"));

Yo tengo un org.hibernate.QueryException:no se pudo resolver la propiedad:diferencia excepción.Solución alternativa con este tampoco funciona.

PD:Como no pude encontrar ninguna documentación detallada sobre el uso de QBE para Hibernate, todo lo anterior es principalmente un enfoque de prueba y error.

ProjectionList pl = Projections.projectionList();
pl.add(Projections.property("id"));
pl.add(Projections.sqlProjection("abs(`pageNo`-" + pageNo + ") as diff", new String[] {"diff"}, types ), diff); ---- solution
crit.addOrder(Order.asc("diff"));
crit.setProjection(pl);

Realmente no lo creo, lo que puedo encontrar es la palabra "esto". Hace que el hibernado no incluya restricciones en su consulta, lo que significa que obtuvo todas las listas de registros.En cuanto al error de hibernación que se informó, puedo ver que está solucionado, pero no pude descargar el parche.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top