java - inner - Consulta de criterios de Hibernate para obtener columnas específicas
hibernate projections (2)
Estoy usando Criteria Query en mi código. Siempre dispara select * from ...
En cambio, 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?
Alguna actualización
Agregué una proyección en mi consulta y 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 el problema es como ... Unknown column ''y4_'' in ''where clause''
y el mismo error para y8_, y5_ significa que para todos los que estaban cerca dio un error.
Lo modifiqué a Query 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?
Puede mapear otra entidad basada en esta clase (debe usar el nombre de la entidad para diferenciar las dos) y la segunda será una especie de dto (no olvide que dto tiene problemas de diseño ). debe definir el segundo como de solo lectura y darle un buen nombre para que quede claro que esta no es una entidad regular. por cierto, seleccionar solo algunas columnas se llama proyección, por lo que Google con ella será más fácil.
alternativa: puede crear una consulta con nombre con la lista de campos que necesita (ponerlos en la selección) o usar criterios con proyección
Use Projections para especificar qué columnas le gustaría devolver.
Ejemplo
Consulta SQL
SELECT user.id, user.name FROM user;
Alternativa de Hibernate
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();