2011-12-27 8 views
5

Mam dwie klasy z dwukierunkowym mapowaniem @OneToOne.Wybierz jednostkę, w której nie występuje skojarzenie Hibernacja OneToOne.

Class A { 
@OneToOne(fetch = FetchType.Lazy, mappedBy="a") 
private B b; 
} 

Class B { 
@OneToOne(fetch = FetchType.Eager) 
private A a; 
} 

Potrzebuję napisać kod, aby pobrać wszystkie wystąpienia B, które nie mają powiązania z wystąpieniem A. Ja też trzeba napisać podobną zapytanie dla wszystkich A, które nie mają B.

Próbowałem:

Criteria criteria = getSession().createCriteria(B.class) 
criteria.add(Restrictions.isNull("a") 

ale to wydaje się zawsze zwraca wartość null. Myśli?

Odpowiedz

9

ten powinien pracować w obu kierunkach:

Criteria criteria = session.createCriteria(B.class, "b"); 
criteria.createAlias("b.a", "a", Criteria.LEFT_JOIN); 
criteria.add(Restrictions.isNull("a.id")); 
+0

Działa. Nie mogłem się domyślić, dlaczego isNull dodawał wartość zerową do niewłaściwej właściwości w moim zapytaniu za pomocą OneToOne. – MattC

+1

Jako, że 'Criteria.LEFT_JOIN' jest teraz wykupione, można użyć' criteria.createAlias ​​("b.a", "a", JoinType.LEFT_OUTER_JOIN); ' –

Powiązane problemy