Objetos duplicados

23 views
Skip to first unread message

César Pistiner

unread,
Sep 14, 2016, 4:05:34 PM9/14/16
to nhibernate-hispano
Hola gente,

Estoy teniendo un problema y no le encuentro la vuelta. Usando NHibernate con Criteria Queries tengo una entidad que es cabecera-detalle y cuando obtengo una lista en la cual debo condicionar el detalle me trae un objeto (cabecera) por cada detalle que tenga. El ejemplo sería así, basado en movimientos de stock:

Tengo 2 movimientos:
- MOVIMIENTO 1
- MOVIMIENTO 2 

Detalle de MOVIMIENTO 1:
- PRODUCTO A - ENTRADA x 10 - POSICION 001
- PRODUCTO A - ENTRADA x 20 - POSICION 002  

Detalle de MOVIMIENTO 1:
- PRODUCTO B - ENTRADA x 10 - POSICION 001
- PRODUCTO B - ENTRADA x 20 - POSICION 002  

Si obtengo una lista condicionando los movimientos con PRODUCTO A, estoy recibiendo una lista que contiene 2 cabeceras, con 2 detalles cada una. Si inspeccionó dicha lista veo que es el mismo movimiento (MOVIMIENTO 1) duplicado.

Ese es el problema, el cual estoy resolviendo con agrupación luego de obtener la lista.

El mapping contra los detalles lo tengo así:

CABECERA
<bag name="Detalles" table="DetalleMovimiento" inverse="true" cascade="all,delete-orphan" lazy="true">
  <key column="IdMovimiento"/>
  <one-to-many class="DetalleMovimiento"/>
</bag>

DETALLE
<many-to-one name="Movimiento" column="IdMovimiento" class="Movimiento" foreign-key="FK_DetalleMovimiento_Movimiento"/>

Luego a través de Criteria Queries lo que hago es:

nhCriteria = nhCriteria.CreateCriteria("Detalles", NHibernate.SqlCommand.JoinType.InnerJoin);

nhCriteria.Add(Restrictions.Eq("Producto", productoAFiltrar));

Eso es todo (creo), agradezco cualquier sugerencia o ayuda, tal vez es un error común, las soluciones que encontré navegando no me dieron resultado.

Espero haber sido claro y desde ya agradezco el tiempo robado!

Aprovecho para saludarlos y agradecer todos los aportes que hacen.
César

Juan José Montes de Oca Arbós

unread,
Sep 14, 2016, 4:14:18 PM9/14/16
to nhibernat...@googlegroups.com
Hola Cesar, no estoy 100% seguro, pero se me ocurre que si no tenés implementados los métodos de Equals y GetHashCode (o los tenés mal implementados) NHibernate podría devolverte dos objetos que para vos son iguales, pero para NH son diferentes. Se que esto ocurre cuando manejas los objetos en memoria, pero no se si ocurre en el caso de consultarlos a la base de datos.

Saludos Y ÉXITOS!!

--
Juan José Montes de Oca Arbós.

===========================
Web personal: http://juanjose.montesdeocaarbos.com.ar/blog/

--
--
Para escribir al Grupo, hágalo a esta dirección: NHibernate-Hispano@googlegroups.com
Para más, visite: http://groups.google.com/group/NHibernate-Hispano
---
Has recibido este mensaje porque estás suscrito al grupo "NHibernate-Hispano" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a nhibernate-hispano+unsub...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

César Pistiner

unread,
Sep 14, 2016, 4:51:50 PM9/14/16
to nhibernat...@googlegroups.com
No es eso Juan José, muchas gracias de todas formas.

Sigo con el problema. Yo pensé que era algo del mapping porque si condiciono solamente por atributos de la cabecera anda perfecto, el tema está cuando creo el Criteria del detalle.

Saludos y gracias!  

--
--
Para escribir al Grupo, hágalo a esta dirección: NHibernat...@googlegroups.com

Para más, visite: http://groups.google.com/group/NHibernate-Hispano
---
Has recibido este mensaje porque estás suscrito al grupo "NHibernate-Hispano" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a nhibernate-hisp...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.

--
--
Para escribir al Grupo, hágalo a esta dirección: NHibernat...@googlegroups.com

Para más, visite: http://groups.google.com/group/NHibernate-Hispano
---
Has recibido este mensaje porque estás suscrito al grupo "NHibernate-Hispano" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a nhibernate-hisp...@googlegroups.com.

César Pistiner

unread,
Sep 15, 2016, 2:53:01 PM9/15/16
to nhibernat...@googlegroups.com
Hola gente!

Bueno he logrado solucionar el problema en forma más óptima y les dejo la forma en que lo hice por si otro se topa con lo mismo.

Anteriormente lo que hacía era agrupar por Id de la cabecera luego de obtener la lista, pero esta claro que esto a nivel performance no es lo ideal, así que encontré la forma de hacer un DISTINCT desde Criteria Queries

Si recuerdan yo creaba el criteria de esta forma:

nhCriteria = nhCriteria.CreateCriteria("Detalles", NHibernate.SqlCommand.JoinType.InnerJoin);  

Pero para que funcione como les mencioné hay que hacer lo siguiente:

var detallesCriteria = DetachedCriteria.For<DetalleMovimientoDeRetornables>().SetProjection(Projections.Distinct(Projections.Property("MovimientoDeRetornables.Id")));

detallesCriteria.Add(Restrictions.Eq("Producto", productoAFiltrar));

nhCriteria.Add(Subqueries.PropertyIn("Id", detallesCriteria));

Con esto quedó funcionando a la perfección.

Saludos!
César

Carlos Peix

unread,
Sep 17, 2016, 8:23:02 AM9/17/16
to nhibernate-hispano
Gracias por compartir la solución genio!

----------------------------------
Carlos Peix

2016-09-15 15:52 GMT-03:00 César Pistiner <chpis...@gmail.com>:
Hola gente!

Bueno he logrado solucionar el problema en forma más óptima y les dejo la forma en que lo hice por si otro se topa con lo mismo.

Anteriormente lo que hacía era agrupar por Id de la cabecera luego de obtener la lista, pero esta claro que esto a nivel performance no es lo ideal, así que encontré la forma de hacer un DISTINCT desde Criteria Queries

Si recuerdan yo creaba el criteria de esta forma:
nhCriteria = nhCriteria.CreateCriteria("Detalles", NHibernate.SqlCommand.JoinType.InnerJoin);  

Pero para que funcione como les mencioné hay que hacer lo siguiente:

var detallesCriteria = DetachedCriteria.For<DetalleMovimientoDeRetornables>().SetProjection(Projections.Distinct(Projections.Property("MovimientoDeRetornables.Id")));

detallesCriteria.Add(Restrictions.Eq("Producto", productoAFiltrar));

nhCriteria.Add(Subqueries.PropertyIn("Id", detallesCriteria));

Con esto quedó funcionando a la perfección.

Saludos!
César
El mié., 14 sept. 2016 a las 17:52, César Pistiner (<chpis...@gmail.com>) escribió:
No es eso Juan José, muchas gracias de todas formas.

Sigo con el problema. Yo pensé que era algo del mapping porque si condiciono solamente por atributos de la cabecera anda perfecto, el tema está cuando creo el Criteria del detalle.

Saludos y gracias!  

--
--
Para escribir al Grupo, hágalo a esta dirección: NHibernate-Hispano@googlegroups.com

Para más, visite: http://groups.google.com/group/NHibernate-Hispano
---
Has recibido este mensaje porque estás suscrito al grupo "NHibernate-Hispano" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a nhibernate-hispano+unsub...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.

--
--
Para escribir al Grupo, hágalo a esta dirección: NHibernate-Hispano@googlegroups.com

Para más, visite: http://groups.google.com/group/NHibernate-Hispano
---
Has recibido este mensaje porque estás suscrito al grupo "NHibernate-Hispano" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a nhibernate-hispano+unsub...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.

--
--
Para escribir al Grupo, hágalo a esta dirección: NHibernate-Hispano@googlegroups.com

Para más, visite: http://groups.google.com/group/NHibernate-Hispano
---
Has recibido este mensaje porque estás suscrito al grupo "NHibernate-Hispano" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a nhibernate-hispano+unsub...@googlegroups.com.

César Pistiner

unread,
Sep 20, 2016, 4:59:01 PM9/20/16
to nhibernate-hispano
Un placer poder contribuir de alguna forma!

Abrazo Carlos querido!

El sáb., 17 sept. 2016 a las 9:23, Carlos Peix (<carlo...@gmail.com>) escribió:
Gracias por compartir la solución genio!

----------------------------------
Carlos Peix
2016-09-15 15:52 GMT-03:00 César Pistiner <chpis...@gmail.com>:
Hola gente!

Bueno he logrado solucionar el problema en forma más óptima y les dejo la forma en que lo hice por si otro se topa con lo mismo.

Anteriormente lo que hacía era agrupar por Id de la cabecera luego de obtener la lista, pero esta claro que esto a nivel performance no es lo ideal, así que encontré la forma de hacer un DISTINCT desde Criteria Queries

Si recuerdan yo creaba el criteria de esta forma:
nhCriteria = nhCriteria.CreateCriteria("Detalles", NHibernate.SqlCommand.JoinType.InnerJoin);  

Pero para que funcione como les mencioné hay que hacer lo siguiente:

var detallesCriteria = DetachedCriteria.For<DetalleMovimientoDeRetornables>().SetProjection(Projections.Distinct(Projections.Property("MovimientoDeRetornables.Id")));

detallesCriteria.Add(Restrictions.Eq("Producto", productoAFiltrar));

nhCriteria.Add(Subqueries.PropertyIn("Id", detallesCriteria));

Con esto quedó funcionando a la perfección.

Saludos!
César
El mié., 14 sept. 2016 a las 17:52, César Pistiner (<chpis...@gmail.com>) escribió:
No es eso Juan José, muchas gracias de todas formas.

Sigo con el problema. Yo pensé que era algo del mapping porque si condiciono solamente por atributos de la cabecera anda perfecto, el tema está cuando creo el Criteria del detalle.

Saludos y gracias!  

--
--
Para escribir al Grupo, hágalo a esta dirección: NHibernat...@googlegroups.com

Para más, visite: http://groups.google.com/group/NHibernate-Hispano
---
Has recibido este mensaje porque estás suscrito al grupo "NHibernate-Hispano" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a nhibernate-hisp...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.

--
--
Para escribir al Grupo, hágalo a esta dirección: NHibernat...@googlegroups.com

Para más, visite: http://groups.google.com/group/NHibernate-Hispano
---
Has recibido este mensaje porque estás suscrito al grupo "NHibernate-Hispano" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a nhibernate-hisp...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.

--
--
Para escribir al Grupo, hágalo a esta dirección: NHibernat...@googlegroups.com

Para más, visite: http://groups.google.com/group/NHibernate-Hispano
---
Has recibido este mensaje porque estás suscrito al grupo "NHibernate-Hispano" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a nhibernate-hisp...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.

--
--
Para escribir al Grupo, hágalo a esta dirección: NHibernat...@googlegroups.com

Para más, visite: http://groups.google.com/group/NHibernate-Hispano
---
Has recibido este mensaje porque estás suscrito al grupo "NHibernate-Hispano" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a nhibernate-hisp...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages