2010-06-16 10 views
6

Come posso forzare NHibernate a fare un join esterno DESTRO o un join INNER invece di un join esterno LEFT su una collezione molti a molti?Esterno interno o destro Unire in Nibernato e Fluente Nibernetico su molti a molti collezione

Il motivo per cui vorrei farlo è dovuto al filtro applicato agli elementi della raccolta. Con un join sinistro, si ottiene lo stesso numero di righe restituite come query non filtrata, ma gli elementi filtrati mostrano solo NULL per tutti i campi. Tuttavia, con un join corretto, il numero corretto di righe ed elementi viene restituito dalla query.

Mi aspetterei che si potrebbe indicare il join da qualche parte nella mappatura della collezione ..

+0

ha senso? stai chiedendo di recuperare una raccolta di entità che non hanno alcuna connessione all'entità root – Jaguar

+0

@Jaguar: Sì, perché ho un caso in cui i filtri vengono applicati agli elementi uniti. Tuttavia, poiché la tabella di join è la tabella principale della query, quando I SINCR. Si unisce, ottengo più righe rispetto alle entità filtrate effettive che desidero, con le entità filtrate solo con NULL in tutte le colonne. – snicker

risposta

5

non credo che sia possibile specificare un diritto o inner join nella mappatura di raccolta. Le uniche opzioni con la clausola fetch sono il join esterno sinistro predefinito e la selezione sequenziale.

Il problema è che quando si crea una mappatura, NHibernate deve sapere come recuperare gli elementi di raccolta per qualsiasi oggetto radice arbitrario dal lato sinistro del join. Con un join destro o interno, l'oggetto radice potrebbe non esistere nella raccolta restituita, quindi sei bloccato a quel punto.

Se i criteri del filtro sono statici, è possibile specificare una clausola where nella mappatura. Penso che questa sarebbe la soluzione raccomandata per la tua situazione.

Una soluzione alternativa sarebbe rendere la raccolta privata nell'oggetto, quindi creare un'altra proprietà che richiami una query HQL per implementare il join interno e restituire tale raccolta. Questa raccolta restituita avrebbe la semantica desiderata, ma avrai bisogno di metodi separati per aggiungere o rimuovere elementi dalla raccolta.

+0

Questa è fondamentalmente la soluzione che ho implementato. Ho permesso alle query di restituire l'intera collezione non filtrata e ho eseguito il filtraggio manualmente sul lato dell'applicazione delle cose. Non molto elegante a causa della quantità di dati extra che attraversa il filo in alcuni casi, ma sicuramente la soluzione più semplice senza aprire la fonte di NH e farla ingarbugliare widdly in quello che voglio. – snicker

+0

Questa è la ragione per cui ho suggerito di chiamare HQL da una proprietà. Il filtraggio sarebbe fatto al DB. Non avresti bisogno di fare qualcosa di speciale con NH, basta eseguire una query all'interno di una proprietà non mappata. A seconda del set di dati, il trasferimento dati ridotto potrebbe essere significativo. –

1

È possibile utilizzare la sintassi HQL di NHibernate per generare una query che ricorda SQL, ma utilizza le capacità di mapping di NHibernate. HQL supporta right outer join (o solo right join in breve). Le pagine che seguono sono buone referenze per linguaggio di query HQL di NHibernate:

+0

Ho bisogno che questo accada su qualsiasi recupero dal database. Non solo domande specifiche. – snicker