2012-07-24 70 views
39

Estoy usando Criteria Query en mi código. Siempre dispara select * from ...Hibernate Criterios Consulta para obtener columnas específicas

En su lugar, quiero descuidar una columna (campo) de mi consulta ya que ese campo tiene una gran cantidad de datos almacenados en bytes. Y eso causa problemas de rendimiento.

¿Alguien puede dar una idea para eso?


Algunos Actualización

añadí una proyección en mi consulta y se creó una consulta como ...

select 
    this_.TEMPLATE_ID as y0_, 
    this_.TEMPLATE_NAME as y1_, 
    this_.CREATE_DATE as y2_, 
    this_.UPDATE_DATE as y3_, 
    this_.STATUS_CODE as y4_, 
    this_.USER_ID as y5_, 
    this_.UPDATED_BY as y6_, 
    this_.CATEGORY_ID as y7_, 
    this_.PRACTICE_ID as y8_ 
from 
    templates this_ 
inner join 
    user user1_ 
     on this_.USER_ID=user1_.USER_ID 
inner join 
    template_categories category2_ 
     on this_.CATEGORY_ID=category2_.CATEGORY_ID 
where 
    y4_=? 
    and y8_=? 
    and y5_ in (
     ?, ? 
    ) 
order by 
    y1_ asc limit ? 

Y ahora cuestión es como .. Unknown column 'y4_' in 'where clause' y mismo error para y8_, y5_ significa que para todos los que estaban cerca dio un error.

que lo modificó para consulta como ...

select 
    this_.TEMPLATE_ID as y0_, 
    this_.TEMPLATE_NAME as y1_, 
    this_.CREATE_DATE as y2_, 
    this_.UPDATE_DATE as y3_, 
    this_.STATUS_CODE as y4_, 
    this_.USER_ID as y5_, 
    this_.UPDATED_BY as y6_, 
    this_.CATEGORY_ID as y7_, 
    this_.PRACTICE_ID as y8_ 
from 
    templates this_ 
inner join 
    user user1_ 
     on this_.USER_ID=user1_.USER_ID 
inner join 
    template_categories category2_ 
     on this_.CATEGORY_ID=category2_.CATEGORY_ID 
where 
    this_.STATUS_CODE=1 
    and this_.PRACTICE_ID=1 
    and this_.USER_ID in (
     1, 2 
    ) 
order by 
    y1_ asc limit ? 

y funcionó. ¿Pero no sé cómo modificarlo en HQL?

Respuesta

81

Uso Projections para especificar las columnas que desea devolver.

Ejemplo

de consultas SQL

SELECT user.id, user.name FROM user; 

Hibernate Alternativa

Criteria cr = session.createCriteria(User.class) 
    .setProjection(Projections.projectionList() 
     .add(Projections.property("id"), "id") 
     .add(Projections.property("Name"), "Name")) 
    .setResultTransformer(Transformers.aliasToBean(User.class)); 

    List<User> list = cr.list(); 
+0

¿Es posible hacer lo mismo con JPA? – cingulata

+0

@cingulata sí, es posible. revisa este artículo http://www.objectdb.com/java/jpa/query/jpql/select –

0

Puede mapear otra entidad basada en esta clase (debe usar el nombre de la entidad para distinguir las dos) y la segunda será una especie de dto (no olvide que dto has design issues). debe definir el segundo como de solo lectura y darle un buen nombre para que quede claro que esta no es una entidad común. por cierto, seleccione solo algunas columnas que se denominan proyección, por lo que google será más fácil.

alternativa - puede crear consulta con nombre, con la lista de los campos que necesite (se los pone en el selecto) o criterios de uso con la proyección

+0

http://www.mkyong.com/hibernate/hibernate-named-query- Ejemplos/ –

Cuestiones relacionadas