2009-09-24 18 views
7

Mam tę klasę zmapowaną jako obiekt, można ją nazwać Person. Osoba ma powiązaną/komponentową relację z adresem. Mam problem z używaniem kryteriów zwracających obiekty adresów. Próbowałem tego:Pobieranie pliku emebedded lub komponentu przy użyciu Kryteriów Hibernacji api

Criteria.createCriteria(Address.class) 

Który nie działa. Chyba muszę przejść przez ten byt, ale wtedy potrzebowałbym jakiejś projekcji?

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

Sugestie?

Odpowiedz

6

Czas życia elementu jest kontrolowany przez jego właściciela; NIE są uważane za skojarzenia. Dlatego nie można samodzielnie pobrać komponentu z zapytania. Możesz jednak użyć go w kryteriach.

Zakładając swoją klasę „Adres” jest odwzorowany jako „adres” w „osoba”, można zrobić coś takiego:

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

Ok, ale jak to się stało, że mogę zrobić HQL i pobrać adres bezpośrednio? Dlaczego to samo nie dotyczy zapytań? – Konstantin

+0

Ponieważ HQL ma możliwości, których API Kryteriów nie ma. Teraz, jeśli naprawdę chcesz sam zwrócić swój adres za darmo, możesz utworzyć listę projekcji dla kryteriów opartych na osobie, która zawierałaby każdą właściwość adresu (i nic więcej) i zastosować "AliasToBeanResultTransformer" do wyniku. Ale to dużo bólu głowy i nic do pokazania; Zamiast tego wybrałbym pełną osobę i wyodrębniłbym adres (jeśli tego potrzebujesz) w kodzie java. Lub przejdź z HQL. – ChssPly76

0

W ten sposób można odzyskać lub przekazać własność obiektu osadzonego w hibernacji. powyżej

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

Nadzieja wyjaśnia

Powiązane problemy