Java ResultSet cómo verificar si hay algún resultado

El conjunto de resultados no tiene método para hasNext. Quiero comprobar si el resultado tiene algún valor

es esta la manera correcta

if (!resultSet.next() ) { System.out.println("no data"); } 

Eso es correcto, inicialmente el cursor del ResultSet apunta hacia antes de la primera fila, si la primera llamada a next() devuelve false entonces no hubo datos en el ResultSet .

Si usa este método, es posible que deba llamar beforeFirst() inmediatamente después para restablecerlo, ya que ahora se ha posicionado más allá de la primera fila.

Sin embargo, cabe señalar que la respuesta de Seifer a continuación es una solución más elegante a esta pregunta.

Suponiendo que está trabajando con un ResultSet recién devuelto cuyo cursor apunta antes de la primera fila, una manera más fácil de verificar esto es simplemente llamar a isBeforeFirst() . Esto evita tener que retroceder si se deben leer los datos.

Como se explica en la documentación , esto devuelve falso si el cursor no está antes del primer registro o si no hay filas en ResultSet .

 if (!resultSet.isBeforeFirst() ) { System.out.println("No data"); } 

siempre puedes hacer la siguiente desde el principio, y solo hacer una comprobación de bucle

 if (!resultSet.next() ) { System.out.println("no data"); } else { do { //statement(s) } while (resultSet.next()); } 

Por lo general, harías algo como esto:

 while ( resultSet.next() ) { // Read the next item resultSet.getString("columnName"); } 

Si desea informar un conjunto vacío, agregue una variable que cuente los elementos leídos. Si solo necesita leer un solo artículo, entonces su código es adecuado.

De acuerdo con la respuesta más viable, la sugerencia es usar “isBeforeFirst ()”. Esa no es la mejor solución si no tiene un “tipo de solo reenvío” .

Hay un método llamado ” .first () “. Es menos exagerado obtener exactamente el mismo resultado. Verifica si hay algo en tu “conjunto de resultados” y no avanzas el cursor.

La documentación indica: “(…) falso si no hay filas en el conjunto de resultados “.

 if(rs.first()){ //do stuff } 

También puede simplemente llamar a isBeforeFirst () para comprobar si se han devuelto algunas filas sin avanzar el cursor, luego proceda normalmente. – SnakeDoc, 2 de septiembre de 2014 a las 19:00

Sin embargo, hay una diferencia entre “isBeforeFirst ()” y “first ()”. Primero genera una excepción si se realiza en un conjunto de resultados del tipo “solo reenviar”.

Compare las dos secciones de tiro: http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#isBeforeFirst () http://docs.oracle.com/javase/7/docs /api/java/sql/ResultSet.html#first ()

De acuerdo, básicamente esto significa que debes usar “isBeforeFirst” siempre que tengas un tipo “forward only”. De lo contrario, es menos excesivo usar “primero ()”.

Es mejor usar ResultSet.next () junto con la syntax do {…} while () para esto.

La llamada “Comprobar resultados” ResultSet.next () mueve el cursor a la primera fila, por lo tanto, utilice la syntax do {…} while () para procesar esa fila mientras continúa procesando las filas restantes devueltas por el ciclo.

De esta forma, puede verificar los resultados y, al mismo tiempo, procesar los resultados devueltos.

 if(resultSet.next()) { // Checks for any results and moves cursor to first row, do { // Use 'do...while' to process the first row, while continuing to process remaining rows } while (resultSet.next()); } 

Para estar totalmente seguro de que el resultado está vacío o no, independientemente de la posición del cursor, haría algo como esto:

 public static boolean isMyResultSetEmpty(ResultSet rs) throws SQLException { return (!rs.isBeforeFirst() && rs.getRow() == 0); } 

Esta función devolverá verdadero si ResultSet está vacío, falso si no, o lanza una SQLException si ese ResultSet está cerrado / no inicializado.

Eso funcionaría si quiere ver si hay filas en el conjunto de resultados sí.

Tenga en cuenta que next() siempre se mueve a la siguiente fila, por lo que si planea leer el conjunto de resultados, debe tenerlo en cuenta.

El uso habitual con ResultSet (cuando simplemente se lee) es:

 while (resultSet.next()) { ... read from the row here ... } 

Lo cual obviamente no funcionará correctamente si invocó a next() una vez para verificar si el conjunto de resultados estaba vacío, así que tenga cuidado. Aunque existen métodos para “realizar copias de seguridad”, no son compatibles con todos los tipos de conjuntos de resultados.

 if (!resultSet.isAfterLast() ) { System.out.println("No data"); } 

isAfterLast() también devuelve false para el conjunto de resultados vacío, pero dado que el cursor está antes de la primera fila, este método parece más claro.

Esta es una pieza práctica y fácil de leer, creo.

  if (res.next()) { do { // successfully in. do the right things. } while (res.next()); } else { // no results back. warn the user. } 

Lo mejor que puede hacer es verificar la primera fila para que cuando tenga la intención de obtener la información pueda evitar el error de omitir una fila. Algo así como: if (! ResultSet.first ()) {System.out.println (“sin datos”); }

Al usar resultSet.next () puede obtener fácilmente el resultado, ya sea resultSet que contenga algún valor o no

 ResultSet resultSet = preparedStatement.executeQuery(); if(resultSet.next()) //resultSet contain some values else // empty resultSet 
 ResultSet rs = rs.executeQuery(); if(rs.next()) { rs = rs.executeQuery(); while(rs.next()) { //do code part } } else { //else if no result set } 

Es mejor volver a ejecutar la consulta porque cuando llamamos a if(rs.next()){....} se ejecutará la primera fila de ResultSet y luego dentro while(rs.next()){....} obtendremos el resultado de la próxima línea. Así que creo que la re-ejecución de la consulta dentro de if es la mejor opción.

 ResultSet result = stmt.executeQuery(sqlQuery); if (!result.next()) status = "ERROR"; else status = "SUCCESS"; 

Creé el siguiente método para verificar si un ResultSet está vacío.

 public static boolean resultSetIsEmpty(ResultSet rs){ try { // We point the last row rs.last(); int rsRows=rs.getRow(); // get last row number if (rsRows == 0) { return true; } // It is necessary to back to top the pointer, so we can see all rows in our ResultSet object. rs.beforeFirst(); return false; }catch(SQLException ex){ return true; } } 

Es muy importante tener las siguientes consideraciones:

El objeto CallableStatement se debe configurar para que el objeto ResultSet vaya al final y vuelva al principio.

TYPE_SCROLL_SENSITIVE : el objeto ResultSet puede desplazarse al final y volver al principio. Además puede atrapar los últimos cambios.

CONCUR_READ_ONLY : podemos leer los datos del objeto ResultSet, pero no podemos actualizarlos.

 CallableStatement proc = dbconex.prepareCall(select, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); 
 if(resultSet.first) { } else { system.out.println("No raw or resultSet is empty"); } 

Porque si ResultSet no tiene en bruto, entonces resultSet.first devuelve falso.

puedes hacer algo como esto

 boolean found = false; while ( resultSet.next() ) { found = true; resultSet.getString("column_name"); } if (!found) System.out.println("No Data"); 

He estado intentando establecer la fila actual en el primer índice (que trata con las claves principales). Yo sugeriría

 if(rs.absolute(1)){ System.out.println("We have data"); } else { System.out.println("No data"); } 

Cuando se completa el ResultSet, apunta a antes de la primera fila. Al configurarlo en la primera fila (indicado por rs.absolute(1) ), se devolverá verdadero que denota que se colocó con éxito en la fila 1, o es falso si la fila no existe. Podemos extrapolar esto a

 for(int i=1; rs.absolute(i); i++){ //Code } 

que establece la fila actual en la posición i y fallará si la fila no existe. Este es solo un método alternativo para

 while(rs.next()){ //Code } 

Creo que la manera más fácil de verificar el conjunto de resultados es a través de CollectionUtils en el paquete org.apache.commons.collections.CollectionUtils

 if(CollectionUtils.isNotEmpty(resultList)){ /** * do some stuff */ } 

Esto verificará la condición de conjunto de resultados vacío y vacío.

Para obtener más información detallada, puede consultar el siguiente documento. ColecciónUtils

¿Por qué no usar rs.getRow ()?

 int getRow() throws SQLException Retrieves the current row number. The first row is number 1, the second number 2, and so on. Note:Support for the getRow method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY Returns: the current row number; 0 if there is no current row Throws: SQLException - if a database access error occurs or this method is called on a closed result set SQLFeatureNotSupportedException - if the JDBC driver does not support this method Since: 1.2 

Para mí, compruebe “if (rs.getRow ()! = 0)” parece funcionar bien.

Inicialmente, el objeto del conjunto de resultados (rs) apunta al BFR (antes del primer registro). Una vez que usamos rs.next (), el cursor apunta al primer registro y el rs tiene “verdadero”. Usando el ciclo while puede imprimir todos los registros de la tabla. Después de recuperar todos los registros, el cursor se mueve a ALR (Después del último registro) y se establecerá en nulo. Consideremos que hay 2 registros en la tabla.

 if(rs.next()==false){ // there are no records found } while (rs.next()==true){ // print all the records of the table } 

En pocas palabras, también podemos escribir la condición como while (rs.next ()).