Criterios de hibernación: Unir tabla sin asociación mapeada


Me gustaría usar la api de criterios de Hibernate para formular una consulta particular que une dos entidades. Digamos que tengo dos entidades, Pet y Owner con un propietario que tiene muchas mascotas, pero crucialmente esa asociación no está mapeada en las anotaciones Java o xml.

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

¿Se puede hacer lo mismo utilizando criterios de hibernación? Si es así ¿Cómo?

Gracias, J

Author: Fortyrunner, 2009-04-06

5 answers

Entiendo que si haces esto usando HQL, estás creando una unión cartesiana con un filtro, en lugar de una unión interna. Las consultas de criterios no permiten hacer esto.

 58
Author: David M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-06 10:20:12

Esto es 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));

Update : Esto en realidad realiza una sub-consulta en lugar de una unión, pero le permite utilizar Criterios en dos entidades que no tienen una relación de hibernación definida.

 76
Author: Pierre Pretorius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-21 07:03:20

En NHibernate puede usar subconsultas que se definen como criterios separados. No estoy seguro de si funciona igual en Java, lo más probable es que 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);

Supone que se une usando el nombre del propietario.

 1
Author: Stefan Steinegger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-15 13:40:23
Criterion ownerCriterion = Restrictions.sqlRestriction(SELECT ownerId FROM   Owner WHERE ownerName ='bob');
Criteria criteria = getSession().createCriteria(Pet.class);
criteria.createCriteria("ownerId").add(ownerCriterion);
 0
Author: javasmith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-20 20:13:57

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

 -1
Author: tpdi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-01 13:46:41