2010-06-16 20 views
6

¿Cómo puedo forzar a NHibernate a hacer una unión externa DERECHA o una unión INTERIOR en lugar de una combinación externa IZQUIERDA en una colección de muchos a muchos?Emérito interno o derecho Unir en Nhibernate y Nhibernate fluido en la colección Muchos a muchos

La razón por la que quisiera hacer esto es porque el filtro se aplica a los elementos de la colección. Con una combinación a la izquierda, obtiene el mismo número de filas devuelto como una consulta no filtrada, pero los elementos que se filtran solo muestran NULL para todos los campos. Sin embargo, con una combinación correcta, se devuelve la cantidad correcta de filas y elementos de la consulta.

yo esperaría que uno podría especificar la unión en algún lugar en el mapeo de la colección ..

+0

¿Eso tiene sentido? está solicitando que obtenga una colección de entidades que realmente no tienen conexión con la entidad raíz – Jaguar

+0

@Jaguar: Sí, porque tengo un caso en el que los filtros se aplican a los elementos unidos. Sin embargo, debido a que la tabla de unión es la tabla principal de la consulta, cuando se IZQUIERDA, obtengo más filas que las entidades filtradas reales que quiero, con las entidades filtradas que solo tienen NULL en todas las columnas. – snicker

Respuesta

5

no creo que es posible especificar un derecho o combinación interna en el mapeo de la colección. Las únicas opciones con la cláusula fetch son la combinación externa izquierda predeterminada y la selección secuencial.

El problema es que cuando crea una asignación, NHibernate necesita saber cómo recuperar los elementos de la colección para cualquier elemento raíz arbitrario del lado izquierdo de la combinación. Con una combinación correcta o interna, el objeto raíz puede no existir en la colección devuelta, por lo que estás atascado en ese punto.

Si el criterio de filtro es estático, puede especificar una cláusula where en la asignación. Creo que esta sería la solución recomendada para su situación.

Una solución alternativa sería hacer que la colección sea privada en su objeto, luego cree otra propiedad que llame a una consulta HQL para implementar la unión interna y devuelva esa colección. Esta colección devuelta tendrá la semántica que desee, pero necesitará métodos separados para agregar o eliminar elementos de la colección.

+0

Esta es básicamente la solución que implementé. Permití que las consultas devolvieran la colección completa sin filtrar y realicé el filtrado manualmente en el lado de la aplicación. No es muy elegante debido a la cantidad de datos adicionales que llegan a través del cable en algunos casos, pero definitivamente es la solución más fácil sin abrir la fuente NH y convertirla en lo que quiero. – snicker

+0

Esa es la razón por la que sugerí llamar a HQL desde una propiedad. El filtrado se haría en DB. No necesitarías hacer nada especial con NH, solo ejecuta una consulta desde dentro de una propiedad no mapeada. Dependiendo de su conjunto de datos, la transferencia de datos reducida puede ser significativa. –

1

Puede utilizar la sintaxis HQL de NHibernate para generar una consulta que es una reminiscencia de SQL, sino que utiliza las capacidades de mapeo de NHibernate. HQL es compatible con right outer join (o solo right join para abreviar). Las siguientes páginas son buenas referencias para el lenguaje de consulta HQL de NHibernate:

+0

Necesito que esto suceda en cualquier recuperación de la base de datos. No solo consultas específicas. – snicker

Cuestiones relacionadas