Critérios de hibernação: unindo a tabela sem uma associação mapeada

Eu gostaria de usar a API de critérios do Hibernate para formular uma consulta específica que une duas entidades. Digamos que eu tenha duas entidades, Pet e Owner, com um dono tendo muitos pets, mas crucialmente essa associação não é mapeada nas annotations ou xml do Java.

Com o hql, eu poderia selecionar proprietários que têm um animal de estimação chamado ‘fido’, especificando a junit na consulta (em vez de adicionar um conjunto de animais de estimação à class proprietária).

O mesmo pode ser feito usando os critérios de hibernação? Se sim como?

Obrigado, J

Meu entendimento é que, se você fizer isso usando HQL, estará criando uma junit cartesiana com um filtro, em vez de uma junit interna. Consultas de critérios não suportam isso.

Isso é de fato possível com critérios:

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

Atualização : Isso realmente executa uma subconsulta em vez de uma associação, mas permite usar Critérios em duas entidades que não possuem um relacionamento de hibernação definido.

No NHibernate você pode usar subconsultas que são definidas como DetachedCriteria. Não tenho certeza se funciona da mesma forma em Java, provavelmente é o mesmo:

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

Assumindo que ela seja unida usando o nome do proprietário.

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

Há um SQLCriterion , que você pode fornecer SQL arbitrário e adicionar aos seus Criteria . Na string SQL , o token {alias} “será substituído pelo alias da entidade raiz.”