2009-10-06 9 views
12

mam mapowanie hibernacji tak klasą ProductDfnhibernacji domyślny dla łączenia pustych wiele-do-jednego

@ManyToOne(fetch = FetchType.LAZY, optional = true) 
@JoinColumn(name = "productTypeFk", nullable = true) 
public ProductType getProductType() 
{ 
    return productType; 
} 

Należy zauważyć, że związek jest określona jako opcja (a kolumna pustych).

Podczas HQL coś takiego

select p.name as col1, p.productType.name as col2 from ProductDfn p 

sprzężenie wewnętrzne służy do łączenia ProductDfn do Producttype jako hibernacji generuje wyraźny SQL przyłączyć od implicite przyłączenia w klauzuli SELECT.

Jednak w przypadku, gdy productType ma wartość null (w DB), żaden wiersz nie jest zwracany z powodu sprzężenia wewnętrznego. Dla tego związku chciałbym mieć domyślną hibernację do łączenia zewnętrznego (ponieważ relacja jest opcjonalna), więc uzyskałbym "zerowy" powrót dla col2 zamiast bez żadnego wiersza.

Czy ktoś wie, czy jest to możliwe?

Dzięki.

Odpowiedz

9

Łączenie wewnętrzne jest używane, ponieważ jawnie podano p.productType.name w klauzuli select. To by się nie stało, gdybyś tylko wybrał ProductDfn, ponieważ twoje pobieranie jest ustawione na LAZY.

Jeśli tylko trzeba pobrać te dwie właściwości musisz jawnie określić zewnętrzną przyłączyć zapytanie:

select p.name as col1, ptype.name as col2 
    from ProductDfn p 
    left join fetch p.productType ptype 
+1

Dzięki, szukałem sposobu, aby mieć hibernacji zmienić to domyślne dołączyć typ dla niejawne sprzężenia wykonane w klauzuli select. Powodem jest to, że mamy aplikację, w której wiele zapytań jest generowanych automatycznie/częściowo na podstawie danych tabelarycznych. Możemy zrobić obiekt bazowy = ProductDfn i col1 to nazwa, col2 to productType.name itd. Zwykle działa to dobrze, tylko dla zerowych kluczy obcych nie działa tak, jak bym chciał. –

+2

Nie ma jednak "domyślnego typu łączenia" - niejawne łączenie zawsze będzie wewnętrznym. Jeśli twoje zapytania są generowane, zastanów się nad użyciem Kryteriów zamiast HQL - w zasadzie wymusza to użycie, aby wyraźnie opisać powiązanie (poprzez alias/kryteria zagnieżdżone) i zawsze możesz je określić jako sprzężenie zewnętrzne. – ChssPly76