2013-06-14 12 views
10

Dwie tabele bazy danych mają relację klucza obcego.Łączenie niepowiązanych podmiotów z kryteriami jpa api

są odwzorowane na dwa podmioty i B przez WZP, ale dołączyć kolumny są ręcznie usuwane z jednostek, a więc w WZP klas światowych i B nie są powiązane i nie można nawigować z jednego do drugiego przez pole/właściwość.

Przy użyciu kryteriów api można utworzyć zapytanie łączące dwie tabele?

Wszystkie przykłady znalazłem na internecie używa dołączyć kolumnę, aby osiągnąć cel, ale, jak wspomniano powyżej, został usunięty z kodu, ponieważ większość czasu nie jestem zainteresowany w stosunkach między i B i obawiam się ewentualnych kosztów ogólnych.

Odpowiedz

14

Po pierwsze: relacja klucza obcego służy nie tylko do nawigacji. Służą głównie temu, aby w relacji nie wprowadzać żadnych fałszywych wartości. Mogą również pomóc w optymalizacji zapytań w bazie danych. Radziłbym ci to rozważyć.

W każdym razie, do tworzenia kwerendy, która używa kilku jednostek niepowiązanych, trzeba je jak from (root) podmiotów (jak można zrobić w SQL lub JPQL)

SELECT .... FROM Link l, Training t WHERE l.attribute = t.attribute; 

Root<Link> rootLink = criteriaQuery.from(Link.class); 
Root<Training> rootTraining = criteriaQuery.from(Training.class); 
... 
criteriaQuery.where(
    criteriaBuilder.equal(rootLink.get(link_.linkAttribute), trainingLink)); 
+0

Warto zauważyć, że korzystanie z wielu korzeni tworzy iloczyn kartezjański (czyli 'CROSS JOIN') pomiędzy podmiotami. W warunku "WHERE" zachowanie to jest takie samo jak 'INNER JOIN' (w tym samym wykonaniu, jak odnotowano [tutaj] (https://stackoverflow.com/questions/670980#671023)). –

Powiązane problemy