ADF tips: ¿Este View Object tiene resultados?

En este breve tip comentaremos los diferentes métodos para saber si un View Object tiene o no resultados en un determinado momento.

Existe el método ViewObjectImpl.getEstimatedRowCount() que internamente hará uso del método getQueryHitcount(), que a su vez envolverá la query del View Object bajo un select count(*) y nos devolverá un objeto de tipo long con el número de filas.

1
long numeroFilas = myViewObject.getEstimatedRowCount();

Otro método es el ViewObject.getRowCount(), que recorrerá todas y cada una de las filas haciendo uso del método next() para saber cuántas filas hay en ese momento. Como bien parece, el uso de este método puede ocasionar graves problemas de rendimiento en caso de que el View Object tenga un número elevado de registros.

1
int numeroFilas = myViewObject.getRowCount();

Si hacemos caso a los manuales oficiales, y a la mayoría de recomendaciones, el método más óptimo es getEstimatedRowCount(), pero en la práctica este método también puede ocasionarnos algún problema de rendimiento. Por ejemplo, si invocamos a este método en un View Object cuya sentencia tiene un coste muy elevado (acceso a una tabla de varios millones de registros), puede llegar a ocasionar problemas de rendimiento en nuestra aplicación.

La mayoría de veces hacemos uso de estos métodos para comprobar si hay o no resultados en un View Object, bien tras ejecutar una consulta o bien a la entrar a una pantalla por primera vez. Para evitar posibles problemas de rendimiento debemos pensar formas alternativas para comprobar si tenemos o no resultados. La forma más simple es comprobar si el método first() devuelve un resultado o no.

1
boolean hayUnaFila = myViewObject.first() != null;

Esta misma idea podemos aplicarla a otros escenarios, como puede ser contar si una consulta sólo nos ha devuelto 1 resultado o por el contrario ha devuelto 2 o más filas. Podemos acceder al iterador del ViewObject y, una vez posicionados en el primer elemento, el método hasNext() nos dirá si tenemos 2 resultados o simplemente 1.

1
2
3
4
5
RowSetIterator myIterator = myViewObject.createRowSetIterator(null);
boolean hayUnafila = myIterator.first() != null;
myIterator.next();
boolean hayAlMenosDosFilas = myIterator.hasNext();
myIterator.closeRowSetIterator();
Evolución, innovación y transformación
35 especializaciones avaladas por Oracle
Oportunidades ilimitadas
El equipo marca la diferencia
Posts 100% Oracle
Sigue nuestro día a día