hibernate - significa - Criterios de hibernación unir consulta uno a muchos
relacion muchos a muchos spring (2)
Los criterios solo pueden seleccionar proyecciones, o la entidad raíz. No es una entidad unida. Algunas consultas son, por lo tanto, imposibles de expresar con Criteria (lo cual es una buena razón más para usar HQL, además de una mejor legibilidad y concisión).
No todo está perdido aquí, sin embargo, porque su asociación es bidireccional. Así que solo necesitas el equivalente de la consulta HQL
select distinct owner from Owner owner
join owner.cats cat
where cat.eyeColor = ''blue''
Cual es
Criteria c = session.createCriteria(Owner.class, "owner");
c.createAlias("owner.cats", "cat");
c.add(Restrictions.eq("cat.eyeColor", "blue");
c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
Tengo una clase de gato y una clase de propietario. Un gato tiene un dueño pero un dueño puede tener muchos gatos. Lo que quiero consultar es conseguir a todos los propietarios que tienen un gato con ojos azules .
class Cat {
Owner owner; //referenced from Owner.id
String eyeColor;
}
class Owner {
List<Cat> catList;
}
Probé algunos códigos pero realmente no sé qué hacer.
Criteria criteria = getCurrentSession().createCriteria(cat.getClass(), "cat");
criteria.createAlias("cat.owner", "owner");
criteria.add(Restrictions.eq("cat.eyeColor", "blue");
Prueba esto:
DetachedCriteria dc = DetachedCriteria.forClass(Cat.class, "inner")
.add(Restrictions.eq("eyeColor", "blue"))
.add(Restrictions.eqProperty("inner.owner", "outer.id"));
session.createCriteria(Owner.class, "outer")
.add(Subqueries.exists(dc))
.list();
Esto puede usar el índice en la base de datos y no realizará una operación distinct
en la memoria como en la versión de @JB Nizet (vea mi comentario allí). El índice será:
CREATE INDEX idx_cat_owner_eyecolor ON Cat(fkOwner, eyeColor)
Piense en distinct
operación distinct
(ya sea en SQL o en la memoria) como en un olor de código. Rara vez se usa y muchos programadores novatos lo usan para solucionar el problema "¿por qué tengo esta fila dos veces". Casi siempre se puede reescribir como en este caso. Los casos de uso, cuando es necesario, son pocos.