2009-04-06 33 views
67

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.Criterios de Hibernate: tabla de unión sin una asociación asignada

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 utilizando los criterios de hibernación? ¿Si es así, cómo?

Gracias, J

Respuesta

56

Mi opinión es que si usted hace esto utilizando HQL, se está creando una combinación cartesiana con un filtro, en lugar de una unión interna. Las consultas de criterios no admiten hacer esto.

+0

David es correcto en esto, no se puede hacer esto con un criterio que pueda hacerlo con HSQL –

+8

Lo sentimos, pronto consiguió un downvote en una respuesta que es casi cuatro años, sin comentario o explicación. ¿Alguien quiere elaborar? –

+13

Acabo de darte un voto aleatorio para compensarlo –

-1

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

+2

¿cómo hacer esto? algún ejemplo? – iPhoneJavaDev

+0

No se proporcionó ningún ejemplo o (al menos) enlace. – n3k0

+0

SQLCriterion ha protegido el constructor – AndreyT

1

En NHibernate puede usar subconsultas que se definen como DetachedCriteria. No estoy seguro si funciona de la misma en Java, lo más probable es la misma:

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 con el nombre del propietario.

73

esto es posible con los 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: En realidad, esto lleva a cabo una sub-consulta en lugar de una unión, pero permite el uso de criterios sobre dos entidades que no tienen una relación de hibernación definido.

+1

¿por qué hay tantos votos positivos? Todavía hay dos criterios diferentes, ¿verdad? – Reddy

+3

Funcionó perfectamente para mí, aquí viene un voto positivo – Avanst

+30

El problema es que esto no es una unión, sino una subconsulta, lo que significa que no puede ordenar los resultados por una columna desde el primer criterio. –

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