O conjunto de resultados não possui método para o hasNext. Quero verificar se o resultadoSet tem algum valor
Esta é a maneira correta
if (!resultSet.next() ) {
System.out.println("no data");
}
O conjunto de resultados não possui método para o hasNext. Quero verificar se o resultadoSet tem algum valor
Esta é a maneira correta
if (!resultSet.next() ) {
System.out.println("no data");
}
Respostas:
Isso está correto, inicialmente o
ResultSet
cursor do apontador está apontando antes da primeira linha, se a primeira chamada paranext()
retornarfalse
, não havia dados noResultSet
.Se você usar esse método, poderá ser necessário chamar
beforeFirst()
imediatamente depois para redefini-lo, pois ele se posicionou após a primeira linha agora.Deve-se notar, no entanto, que a resposta de Seifer abaixo é uma solução mais elegante para essa pergunta.
fonte
isBeforeFirst()
para testar se há alguma linha retornada sem avançar o cursor e prosseguir normalmente.Supondo que você esteja trabalhando com um recém-retornado
ResultSet
cujo cursor esteja apontando antes da primeira linha, uma maneira mais fácil de verificar isso é apenas chamarisBeforeFirst()
. Isso evita a necessidade de rastrear novamente se os dados devem ser lidos.Conforme explicado na documentação , isso retornará false se o cursor não estiver antes do primeiro registro ou se não houver linhas no ResultSet .
fonte
você sempre pode fazer o próximo na frente e apenas fazer uma verificação de loop post
fonte
Você normalmente faria algo assim:
Se você deseja relatar um conjunto vazio, adicione uma variável contando os itens lidos. Se você só precisa ler um único item, seu código é adequado.
fonte
Para ter certeza absoluta de que o conjunto de resultados está vazio ou não, independentemente da posição do cursor, eu faria algo assim:
Essa função retornará true se ResultSet estiver vazio, false se não ou lançará uma SQLException se esse ResultSet estiver fechado / não inicializado.
fonte
É melhor usar ResultSet.next () junto com a sintaxe do {...} while () para isso.
A chamada "verificar se há resultados" resulta em ResultSet.next () move o cursor para a primeira linha; portanto, use a sintaxe do {...} while () para processar essa linha enquanto continua a processar as linhas restantes retornadas pelo loop.
Dessa forma, você pode verificar se há resultados e, ao mesmo tempo, processar os resultados retornados.
fonte
De acordo com a resposta mais viável, a sugestão é usar "isBeforeFirst ()". Essa não é a melhor solução se você não tiver um "tipo somente encaminhamento" .
Existe um método chamado " .first () ". É menos exagero obter exatamente o mesmo resultado. Você verifica se há algo no seu "conjunto de resultados" e não avança o cursor.
A documentação declara: "(...) false se não houver linhas no conjunto de resultados ".
No entanto, há uma diferença entre "isBeforeFirst ()" e "first ()". Primeiro, gera uma exceção se realizada em um conjunto de resultados do tipo "somente encaminhamento".
Compare as duas seções de lançamento: 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 ()
Ok, basicamente isso significa que você deve usar "isBeforeFirst" desde que tenha um tipo "forward forward". Caso contrário, é menos exagerado usar "first ()".
fonte
Isso funcionaria se você quiser ver se há alguma linha no conjunto de resultados sim.
Observe que
next()
sempre passa para a próxima linha; portanto, se você estiver planejando fazer alguma leitura do conjunto de resultados, precisará levar isso em consideração.O uso usual com o ResultSet (ao simplesmente ler) é:
O que obviamente não funcionará corretamente se você
next()
já tiver invocado uma vez para verificar se o conjunto de resultados estava vazio, portanto, preste atenção. Embora existam métodos para "fazer backup", eles não são suportados para todos os tipos de conjuntos de resultados.fonte
Esta é uma peça de leitura prática e fácil, acredito.
fonte
isAfterLast()
também retorna false para o conjunto de resultados vazio, mas como o cursor está antes da primeira linha, esse método parece mais claro.fonte
Porque se ResultSet não tiver raw, então
resultSet.first
retornará false.fonte
A melhor coisa a fazer é verificar a primeira linha para que, quando você pretende obter os dados, possa evitar o erro de pular uma linha. Algo como: if (! ResultSet.first ()) {System.out.println ("sem dados"); }
fonte
Usando resultSet.next (), você pode obter facilmente o resultado, resultSet contendo qualquer valor ou não
fonte
fonte
Eu tenho tentado definir a linha atual para o primeiro índice (lidando com chaves primárias). eu sugeriria
Quando o ResultSet é preenchido, ele aponta para antes da primeira linha. Ao configurá-lo para a primeira linha (indicada por
rs.absolute(1)
), ele retornará true, indicando que foi colocado com sucesso na linha 1 ou false, se a linha não existir. Podemos extrapolar isso paraque define a linha atual para a posição ie falhará se a linha não existir. Este é apenas um método alternativo para
fonte
Eu criei o seguinte método para verificar se um ResultSet está vazio.
É muito importante ter as seguintes considerações:
O objeto CallableStatement deve ser configurado para permitir que o objeto ResultSet chegue ao final e volte ao topo.
TYPE_SCROLL_SENSITIVE : O objeto ResultSet pode mudar no final e voltar ao topo. Além disso, pode pegar as últimas alterações.
CONCUR_READ_ONLY : podemos ler os dados do objeto ResultSet, mas não podemos atualizar.
fonte
Acho que a maneira mais fácil de verificar o conjunto de resultados é via CollectionUtils, no pacote org.apache.commons.collections.CollectionUtils
Isso verificará a condição do conjunto de resultados nulo e vazio.
Para informações mais detalhadas, você pode consultar o seguinte documento. ColeçãoUtils
fonte
Por que não usar rs.getRow ()?
Para mim, verifique "se (rs.getRow ()! = 0)" parece funcionar muito bem.
fonte
você pode fazer algo assim
fonte
É melhor executar novamente a consulta, porque quando chamarmos a
if(rs.next()){....}
primeira linha do ResultSet será executada e, depois delawhile(rs.next()){....}
, obteremos o resultado da próxima linha. Então, acho que a reexecução da consulta internaif
é a melhor opção.fonte
Inicialmente, o objeto do conjunto de resultados (rs) aponta para o BFR (antes do primeiro registro). Uma vez que usamos rs.next (), o cursor aponta para o primeiro registro e o rs mantém "true". Usando o loop while, você pode imprimir todos os registros da tabela. Depois que todos os registros são recuperados, o cursor se move para ALR (Após o último registro) e será definido como nulo. Vamos considerar que existem 2 registros na tabela.
Em resumo, também podemos escrever a condição como while (rs.next ()).
fonte