left - nhibernate session createquery
Criterios de Hibernate para "en subselección" (3)
Intento hacer algo como esto, pero usando Criteria
lugar de HQL
:
select user from User where user in (
select user from UserDomain where domain.id = "XXX"
)
El usuario es una entidad que tiene una relación de one-to-many
con la tabla de unión UserDomain. El punto aquí es simplemente encontrar Usuarios que están vinculados a un Domain
tenga id = "XXX".
Parece que debería ser muy simple ... pero hasta el momento no tengo suerte para encontrar ningún documento útil.
En las cláusulas usualmente se puede transformar en join. Tyr esto:
Criteria c = session.createCriteria(User.class, "u");
c.createAlias("u.userDomain", "ud"); // inner join by default
c.add(Restrictions.le("ud.id", 1));
Finalmente lo encontré. Resulta que no era tan difícil después de todo ... ¡una vez que lo sabes!
criteria = criteria.createCriteria(User.USER_DOMAINS).add(Restrictions.eq(UserDomain.DOMAIN, domain));
Sí, había era, mirándome directamente en el Javadoc: http://www.dil.univ-mrs.fr/~massat/docs/hibernate-3.1/api/org/hibernate/Criteria.html
La subconsulta es muy útil en casos, que necesita buscar en el Usuario, teniendo User - Dominios uno-a-muchos . En ese caso, WHERE UserId IN (subquery)
aporta grandes ventajas: todavía estamos trabajando con una tabla / entidad de User
plana ... para que podamos hacer la paginación adecuada.
Aquí está la documentación 15.8. Consultas separadas y subconsultas
El borrador podría ser: subconsulta:
DetachedCriteria userSubquery = DetachedCriteria.forClass(UserDomain.class, "ud")
// Filter the Subquery
.add(Restrictions.eq(UserDomain.DOMAIN, domain))
// SELECT The User Id
.setProjection( Projections.property("ud.userId") );
Y la consulta principal:
Criteria query = session.createCriteria(User.class, "u")
.add( Subqueries.propertyIn("u.id", userSubquery) );
Ahora tenemos una consulta, que podría usarse para paginación