2011-07-19 9 views
12

Rozważmy następujący dwóch relacji:Hibernate: Kryteria ze stołem do dołączenia wielu do wielu?

@Entity class Foo { 
    @Id id; 

    @ManyToMany 
    @JoinTable(name = "ATag", 
     joinColumns = @JoinColumn(name = "foo_id"), 
     inverseJoinColumns = @JoinColumn(name = "tag_id")) 
    Set<Tag> tags; 
} 

@Entity class Tag { 
    @Id Long id; 
    String name; 
} 

Nie ma odpowiednia klasa jednostka do łączenia tabeli atag. Teraz chcę uzyskać wszystkie instancje Foo z tagiem o nazwie "tag1", czy możliwe jest użycie tylko kryteriów?

Może być pomocne pod-zapytanie, ale nie mogę utworzyć DetachedCriteria dla klasy ATag.class, która nie istnieje.

Odpowiedz

24

Zajmowałem się właśnie tym problemem. Myślicie w tabelach, a nie przedmiotach. Wystarczy odwołać tags.name i niech hibernacji zająć się resztą:

Criteria crit = session.createCriteria(Foo.class); 
crit.createAlias("tags", "tagsAlias"); 
crit.add(Restrictions.eq("tagsAlias.name", someValue); 

Jeśli oglądasz SQL Hibernacja wypluwa, zobaczysz że używa tabeli dołączyć.

+1

Należy pamiętać o używaniu właściwości obiektu, a nie samego obiektu. Ograniczenia za pomocą hibernacji używają nie tylko klucza podstawowego zdefiniowanego przez POJO. W tym przykładzie użyto nazwy atrybutu znaczników obiektów. Straciłem czas, próbując ustawić cały obiekt zamiast jawnie powiedzieć, która własność musi być sprawdzona zgodnie z predykatem kryteriów. –

+3

Dlaczego konieczne jest użycie aliasu? Nie możesz po prostu użyć 'tags.name' zamiast' tagsAlias.name'? – sp00m

+0

Utworzenie aliasu powoduje automatyczne sprzężenie wewnętrzne. – derrik

Powiązane problemy