2009-09-24 16 views
7

Ho questa classe mappata come entità, chiamiamola Persona. La persona ha una relazione incorporata/componente all'indirizzo. Sto riscontrando problemi nell'utilizzo di un criterio che restituisce gli oggetti Indirizzo. Ho provato questo:Recupera emebedded o componente utilizzando i Criteri di ibernazione api

Criteria.createCriteria(Address.class) 

Il che non funziona. Credo di aver bisogno di passare attraverso l'entità ma poi avrei bisogno di qualche tipo di proiezione?

Criteria.createCriteria(Person.class).<<what goes here???>> 

suggerimenti?

risposta

6

La durata del componente è controllata dal suo proprietario; NON sono considerati associazioni. Pertanto non è possibile recuperare il componente da solo da una query. Tuttavia, è possibile utilizzarlo in base a criteri.

Supponendo che la tua classe "Address" viene mappato come "indirizzo" all'interno di "persona", si potrebbe fare qualcosa di simile:

Criteria.createCriteria(Person.class) 
.add(Restrictions.eq("address.street", street)); 
+0

Ok, ma come mai posso fare un HQL e recuperare direttamente l'indirizzo? Perché non vale lo stesso per le domande? – Konstantin

+0

Perché HQL ha funzionalità che l'API Criteri non ha. Ora, se vuoi davvero restituire il tuo Indirizzo da solo ad ogni costo, puoi creare un elenco di proiezione per i criteri basati su Persona che conterrà ogni proprietà di Indirizzo (e nient'altro) e applicherà 'AliasToBeanResultTransformer' a un risultato. Ma questo è un sacco di mal di testa e nulla da mostrare per questo; Selezionerei invece la persona completa e estrarre l'indirizzo (se è quello che ti serve) nel codice java. Oppure vai con HQL. – ChssPly76

0

Questo è come si possa recuperare oppure rinviare la proprietà di oggetto incorporato in ibernazione.

Criteria criteria = sessionFactory.getCurrentSession().createCriteria(
       Parent.class,"parent"); 
criteria.createAlias("embeddedObjectFieldName", "parent.embeddedObjectFieldName"); 

criteria.setProjection(Projections.projectionList() 
       .add(Projections.groupProperty("parent.propertyOne")) 
       .add(Projections.max("embeddedObjectFieldName.embeddedobjectproperty"))); 

Speranza sopra chiarisce

Problemi correlati