tablas significa relacion qué one muchos mapear many cascada borrar bidireccional hibernate hibernate-criteria

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.