2009-04-06 12 views
67

Vorrei utilizzare la API dei criteri di Hibernate per formulare una query particolare che unisce due entità. Diciamo che ho due entità, Pet e Owner con un proprietario che ha molti animali domestici, ma in modo cruciale tale associazione non è mappata nelle annotazioni Java o xml.Criteri di ibernazione: unione di una tabella senza associazione mappata

Con hql, potrei selezionare i proprietari che hanno un animale domestico chiamato 'fido' specificando il join nella query (piuttosto che aggiungere un set di animali domestici alla classe del proprietario).

Lo stesso può essere fatto usando i criteri di ibernazione? Se é cosi, come?

Grazie, J

risposta

56

La mia comprensione è che se si esegue questa operazione utilizzando HQL, si sta creando un cartesiana si uniscono con un filtro, piuttosto che un inner join. Le query di criteri non supportano questo.

+0

David è corretto su questo, non si può fare questo con un criteri Puoi farlo con HSQL –

+8

Siamo spiacenti, improvvisamente ottenuto un downvote su una risposta che è quasi quattro anni, senza alcun commento o spiegazione. Qualcuno ha cura di elaborare? –

+13

Ti ho appena dato un upvota casuale per rimediare allo –

-1

C'è un SQLCriterion, che è possibile fornire arbitrariamente SQL e aggiungere al numero Criteria. Nella stringa SQL, il token {alias} "sarà sostituito dall'alias dell'entità root."

+2

come fare? qualche esempio? – iPhoneJavaDev

+0

Nessun esempio o (almeno) collegamento fornito. – n3k0

+0

SQLCriterion ha protetto il costruttore – AndreyT

1

In NHibernate è possibile utilizzare sottoquery definite come DetachedCriteria. Non sono sicuro se funziona lo stesso in Java, molto probabilmente è la stessa:

DetachedCriteria pets = DetachedCriteria.For<Pet>("pet") 
    .SetProjection(Projections.Property("pet.ownername")) 
    .Add(/* some filters */); 

session.CreateCriteria(typeof(Owner)) 
    .Add(Subqueries.PropertyIn("name", pets); 

Supposto che si unisce con il nome del proprietario.

73

questo è davvero possibile con criteri:

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

Aggiornamento: Questo esegue effettivamente una sotto-query al posto di un join, ma consente di utilizzare criteri su due entità che non hanno un rapporto di ibernazione definito.

+1

perché ci sono così tanti voti positivi? Ha ancora due criteri diversi, giusto? – Reddy

+3

Ha funzionato perfettamente per me, ecco che arriva il voto – Avanst

+30

Il problema è che non si tratta di un join, ma di una sottoquery, il che significa che non è possibile ordinare i risultati con una colonna dai primi criteri. –

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