2009-10-06 11 views
12

ho una mappatura hibernate come questo in una classe ProductDfnHibernate predefinita unirsi per nullable molti-a-uno

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

nota che il rapporto è definito come optional (e la colonna è nullable).

Quando si fa qualcosa di simile HQL

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

Un inner join serve per unire ProductDfn al di prodotto come Hibernate genera l'SQL esplicito aderire dalla implicita join nella clausola select.

Tuttavia, quando si esegue quanto sopra quando productType è null (nel DB) non viene restituita alcuna riga a causa del join interno. Per questa relazione mi piacerebbe avere l'ibernazione di default per fare un join esterno (perché la relazione è facoltativa), quindi otterrei un "nullo" per col2 piuttosto che nessuna riga.

Qualcuno sa se questo è possibile?

Grazie.

risposta

9

Un join interno viene utilizzato perché hai elencato esplicitamente p.productType.name nella clausola select. Questo non sarebbe successo se dovessi selezionare ProductDfn dato che il tuo recupero è impostato su LAZY.

Se avete solo bisogno di recuperare quei due proprietà si dovrà specificare in modo esplicito un outer join nella query:

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

Grazie, ero alla ricerca di un modo per avere Hibernate cambiare è di default tipo di join per join impliciti fatti nella clausola select. Il motivo è che abbiamo un'app in cui molte query sono auto/semi generate a causa del recupero dei dati tabulari. Quindi possiamo fare oggetto di base = ProductDfn e col1 è name, col2 è productType.name ecc. Normalmente funziona bene, solo per chiavi straniere nullable non funziona nel modo che preferisco. –

+2

Non esiste un "tipo di join predefinito", tuttavia - il join implicito sarà sempre interno. Se le tue query sono state generate, considera l'utilizzo di Criteri anziché HQL: fondamentalmente impone l'uso per descrivere esplicitamente l'associazione (tramite alias/criteri nidificati) e puoi sempre specificarlo come join esterno. – ChssPly76