Hola Rodrigo, gracias por responder.
Verás, el problema es éste. Tengo una serie de registros en una tabla
con llave compuesta columna 1 (C1 en adelante) y columna 2 (C2 en
adelante), si ordenas ascendentemente por ambas columnas (C1 y C2),
tendrás esto:
C1 C2
D01 1
D01 2
D01 3
D11 1
D11 2
D12 4
D12 5
La necesidad es una navegación (anterior, siguiente) entre registros,
por ejemplo; el registro siguiente a (D01 - 1), obviamente es (D01 -
2).
Pregunta: cual es el siguiente registro de (D01 - 3)?...
Respuesta: Debería ser (D11 - 3)
Sin embargo con una consulta ICriteria como la siguiente:
//entidad: registro al que se le quiere obtener el siguiente en la
secuencia.
//entidad.C1 = "D01"
//entidad.C2 = 3
public void SiguienteRegistro (object entidad)
{
ICriteria criteria =
ADSessionFactory.session.CreateCriteria(entidad.GetType());
criteria.Add(Restrictions.Ge("C1",
entidad.C1);
criteria.Add(Restrictions.Ge("C2",
entidad.C2);
criteria.AddOrder(Order.Asc
("C1");
criteria.AddOrder(Order.Asc
("C2");
criteria.SetMaxResults
(2);
}
Se obtiene que el siguiente de (D01 - 3) es (D12 - 5), lo cual no es
correcto, por que no corresponde al siguiente en la secuencia, esto
sucede por el AND que se hace en la consulta SQL mapeada, (WHERE C1 >
entidad.C1 AND C2 > entidad.C2), obviamente el AND de la consulta
arroja un registro que cumpla con ambas condiciones, pero no obtiene
el registro que corresponde al siguiente de (D01 - 3), en este caso
(D11 - 1), sino que retorna D12 - 5), con lo cual se pierde la
secuencia de navegación.
Más bien la pregunta sería: ¿de que forma obtienes el siguiente
registro de un objeto (con llave compuesta) en una consulta con orden
(order by) sin necesidad de realizar un algoritmo altamente costoso
en tiempo y memoria?
Una posible solución es hacerlo con una técnica de paginación
criteria.SetFirstResult(posInicial);
criteria.SetMaxResults
(Desplazamiento);
el problema es que no tengo la "posInicial" que es la posición del
objeto actual en la tabla de BD, para comenzar la paginación, que en
el método ilustrado arriba corresponde al parámetro (entidad).
No he podido hallar una solución a este problema que no requiera un
consumo alto de procesamiento y memoria.
Muchas gracias por su colaboración.
--~--~---------~--~----~------------~-------~--~----~
Para escribir al Grupo, hágalo a esta dirección:
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano
-~----------~----~----~----~------~----~------~--~---