2012-03-09 22 views
6

¿cómo puedo seleccionar la clase de un objeto en HQL? Cuando lo haga lo siguiente:¿Cómo seleccionar la clase de un objeto en HIbernate HQL?

select e.class, e.name from Entity e 

Hibernate devuelve un entero (por ejemplo [12, "name"]) en lugar de un objeto de clase. ¿Cómo puedo devolver una clase Java, o al menos el nombre de la clase o entidad? O, si esto no es posible, ¿cómo puedo convertir el 12 a una clase Java?

Por motivos de rendimiento, no puedo consultar los objetos completos, es decir, que no puedo hacer

select e from Entity 

Saludos, Jochen

Respuesta

8

si está hibernate4, se puede usar HQL 'tipo()' función para obtener tipo de entidad

select type(e), e.name from Entity e 

Si está Hibernate3, la entidad de retorno session.iterate() como HibernateProxy con solamente Identificación y puede obtener el nombre de entidad & id sin inicializar.

Iterator iterator = session.createQuery("from Entity e").iterate(); 
while(iterator.hasNext()) { 
    HibernateProxy object = (HibernateProxy)iterator.next(); 
    System.out.println(object.getHibernateLazyInitializer().getIdentifier()); 
    System.out.println(object.getHibernateLazyInitializer().getEntityName()); 
} 
1

escalar HQL que especifica explícitamente el nombre de columna en la cláusula select devolverá una lista de object[]. Cada índice en la matriz devuelta coincide con la columna correspondiente en la cláusula de selección.

Para devolver una lista de objetos, use select e from Entity e o simplemente from Entity.

List<Entity> result = (List<Entity>) session.createQuery("from Entity").list(); 

restringir el registro devuelto por el HQL, se aplican algunas condiciones en la cláusula WHERE de la HQL, por ejemplo: from Entity e where e.name = xxxxx

+0

me adelantó :) Cuando haya seleccionado las entidades, puede utilizar las llamadas regulares a getClass de Java para conocer la clase devuelta. –

+0

Hola, no puedo hacer eso, ya que estoy consultando dos millones de registros con cientos de clases diferentes. La consulta resultante sería demasiado lenta. – Jochen

+0

¿Puedes aplicar alguna cláusula where en el HQL? –

0

Si desea restringir el número de columnas de la lista de selección , nos puede llamar al operador new dentro del hql.

Es decir,

select new Entity(e.class, e.name) from Entity e 

Además, agregue un constructor correspondiente en la clase Entity que esta consulta se puede utilizar.

Esto le dará el List<Entity>, inicializado con solo 2 valores.

Esto es útil cuando necesita una instantánea de un objeto grande de forma performativa. Lea here para los documentos API o here para ver un ejemplo.

+1

Intenté esto, pero no funcionó con los parámetros de Clase. Saliendo de las obras de e.class. – Jochen

+0

¿cuál es el valor correspondiente para ** Clase ** en DB?Espero que sea una cadena, luego necesitas configurar la cadena e intentar obtener ** la clase ** de ella. – ManuPK

+0

Es una propiedad incorporada de Hibernate. P.ej. en las consultas puede hacer 'seleccionar e.name de Entity e donde e.class = Person'. Sin embargo, 'select e.class' devolverá un int, que necesito asignar a una clase. – Jochen

4

sólo puede utilizar el método addEntity() para decirle a Hibernate a usar su clase para mapear la respuesta

Query query = session.createSQLQuery(
    "select e.class,e.name from Entity e where <your conditions>") 
    .addEntity(Entity.class) 
    List<Entity> result = query.list(); 
+3

Pero eso no es HQL. –

Cuestiones relacionadas