tablas relaciones persistencia mapear entidades ejemplo java hibernate hql criteria

java - persistencia - relaciones hibernate annotations



Criterios de Hibernate: tabla de unión sin una asociación asignada (5)

Me gustaría utilizar la API de criterios de Hibernate para formular una consulta particular que une dos entidades. Digamos que tengo dos entidades, Mascota y Propietario, con un propietario que tiene muchas mascotas, pero lo más importante es que esa asociación no está asignada en las anotaciones Java o xml.

Con hql, podría seleccionar propietarios que tengan una mascota llamada ''fido'' al especificar la unión en la consulta (en lugar de agregar un conjunto de mascotas a la clase propietaria).

¿Se puede hacer lo mismo usando criterios de hibernación? ¿Si es así, cómo?

Gracias, J


En NHibernate puede usar subconsultas que se definen como DetachedCriteria. No estoy seguro si funciona igual en Java, probablemente sea lo mismo:

DetachedCriteria pets = DetachedCriteria.For<Pet>("pet") .SetProjection(Projections.Property("pet.ownername")) .Add(/* some filters */ ); session.CreateCriteria(typeof(Owner)) .Add(Subqueries.PropertyIn("name", pets);

Se supone que está unido usando el nombre del propietario.


Esto es de hecho posible con criterios:

DetachedCriteria ownerCriteria = DetachedCriteria.forClass(Owner.class); ownerCriteria.setProjection(Property.forName("id")); ownerCriteria.add(Restrictions.eq("ownername", "bob")); Criteria criteria = getSession().createCriteria(Pet.class); criteria.add(Property.forName("ownerId").in(ownerCriteria));

Actualización : Esto realmente realiza una subconsulta en lugar de una unión, pero le permite usar Criteria en dos entidades que no tienen una relación de hibernación definida.


Hay un SQLCriterion , que puede SQLCriterion SQL arbitrario y agregar a sus Criteria . En la cadena SQL , el token {alias} "será reemplazado por el alias de la entidad raíz".


Tengo entendido que si hace esto usando HQL, está creando una unión cartesiana con un filtro, en lugar de una combinación interna. Las consultas de criterios no admiten hacer esto.


Criterion ownerCriterion = Restrictions.sqlRestriction(SELECT ownerId FROM Owner WHERE ownerName =''bob''); Criteria criteria = getSession().createCriteria(Pet.class); criteria.createCriteria("ownerId").add(ownerCriterion);