Listar linhas de uma Coluna do MySQL com Java

15 respostas
R

Bom dia para todos

Eu andei pela internet até na gringa e acho que ainda ninguém passou por essa questão. Tem como fazer um SELECT no banco e listar a quantidade de linhas preenchidas na Coluna de uma Tabela MySQL? Assim: eu tenho uma tabela com 2 colunas (nome e idade) e queria saber quantas linhas PREENCHIDAS tem na coluna IDADE para somar de acordo com uma determinada condição
(um FOR simples do tipo

for (int i=0; i< NUMERODELINHASPREENCHIDASDACOLUNAidade; i++)

e depois getIdade += resultado [concatena na variável resultado]
e depois Mostrar o resultado).

Existe isso? Se não, teria de fazer isso na unha (tipo criar um método que a classe do conector do MySQL para Java não tem?).

Obrigado e ótimo dia a todos! []´s … fui

15 Respostas

thiagokrathos

Bom dia @rickzale ! Amigo, esse select acho que pode te ajudar, abraço!

select count(*) from Tabela where coluna is not null

C0deuniversal

vamos lá, vamos estuda o caso (não entendi muito sua necessidade)…
você tá usando JPA ou JDBC?, isso me parece até um tanto simples, pode explica melhor a necessidade, você poderia execulta a segunte query para obter todos os valores de idade
SELECT count(*) FROM tabela where idade IS NOT NULL
porém, não vejo a necessidade de se executar um outro SQL uma vez que você já deve ter feito a busca para fazer essa comparação, o ideal seria fazer uma interação sobre essa lista, ou fazer um SQL que traga os dados de forma mas simples de se trabalhar

R

parça obrigado. Vou testar em casa e te falo se deu certo. Por hora obrigado.

R

Grande C0deuniversal!! Cara vou te passar o “porquê” disso já já… por hora vou testar esse select count e ver se da certo. Perguntinha básica: da pra colocar esse resultado numa variável INT por exemplo?

Valeu!!!

C0deuniversal

Certo @rickzale, dei uma olhada nas suas perguntas recentes. e observei que usa JDBC, então nesse caso você pega o result com o interator , um código seria mas ou menos assim:

String sql = "SELECT count(*) as idades FROM tabela where idade IS NOT NULL";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()) int QuantidadeDeIdades  = rs.getInt("idades");

… isso deve trazer ser suficiente para trazer o que você precisa

R

Seguinte: O que eu preciso é que some todas as idades que estiverem preenchidas (se tiver 4 [20 anos, 21 anos, 12 anos e 35 anos) fazer um método que some tudo apresentando no caso do exemplo acima mostrando 88 anos. Depois eu converto isso para String e coloca numa TextField por exemplo. Eu tentei assim mas esta dando erro. Veja se você consegue me ajudar:

public Aluno somar(Aluno aluno){ String sql = "SELECT count(*) as idade WHERE idade IS NOT NULL"; Aluno aluno = new Aluno(); try{ PreparedStatement stmt = conexao.prepareStatement(sql); ResultSet resultado = stmt.executeQuery(); if(resultado.next()){ int somarIdades = aluno.getIdade(); somarIdades += somarIdades; retorno = aluno; } } catch (SQLException ex){ Logger.getLogger(AlunoDAO.class.getName()).log(Level.SEVERE, null, ex); } return retorno; } (o método GETIDADE() é do tipo int)

E não mostra os 88 do exemplo acima. Se o erro estiver na hora de concatenar somarIdades += somarIdades; dai já nem sei. No banco só deixei essas idades para testar. É tudo MySQL. Caso você consiga enchergar o erro (pq ja to desde 2ª-feira da semana passada parado nisso. Esta tudo no padrão MVC e as Visões e a maioria dos controllers estão no jeito, classes DAO, tudo… mas isso de somar as idades (e veja: não sei porque raios o diretor da escola quer que somas as idades… kkk coisa meio complicada de entender porque). Enfim… se puder me ajudar, mostrar o pulo do gato fico agradecido. Valeu. Grande abraço.
Ricardo.

L

se vc quer somar as idades, faz um

SELECT sum(idade) as idade FROM tabela WHERE idade IS NOT NULL

ou

SELECT sum(t.idade) as idade FROM tabela t WHERE t.idade IS NOT NULL

basta colocar nos parênteses a coluna que você quer somar…

Na classe está dando erro porque faltou o FROM na query

R
**Logusmao** Cara deu certo. Obrigado. Mas surgiu uma outra duvida. Agora que ele soma, eu preciso colocar um CRITÉRIO. Assim: ele vai somar as idades de uma data selecionada. No banco isso ja dá certo da jeito que eu quero:
SELECT SUM(IDADE) AS TOTAL FROM ALUNOS WHERE IDADE IS NOT NULL AND DATA='2000-01-01';
E agora preciso fazer o que? Colocar esse valor somado dentro de uma caixa de texto. Mas novamente acho que estou me confundindo. O método de soma esta MAIS ou MENOS assim:
public Aluno somarValoresIdades(Aluno aluno){
        String sql = "SELECT SUM(idade) FROM aluno WHERE aluno IS NOT NULL AND data=?";
        Aluno retorno = new Aluno();
        try{
            PreparedStatement stmt = conexao.prepareStatement(sql);
            stmt.setDate(2, Date.valueOf(aluno.getData()));
            ResultSet resultado = stmt.executeQuery();
            while (resultado.next()){
               double soma = resultado.getDouble(1);
               aluno.setIdade(soma);
               retorno = despesa;
            }
        }catch (SQLException ex){
            Logger.getLogger(DespesaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return retorno;
    }
E dai depois eu fiz no JAVAFX o metodo setarSomaValorIdades(Aluno aluno)
public void setarSomaValorIdades(Aluno aluno){
        if(aluno != null){
            dtData.setValue(aluno.getData());
            
            alunoDAO.setarSomaValorIdades(aluno);
            txValorTotaiIdades.setText(String.valueOf(aluno.getValor()));
            System.out.println(aluno);
        } else{
            txValorTotalIdades.setText(" ");
        }
    }
Bom e compila mas na hora de rodar da o seguinte erro:
Caused by: java.lang.NullPointerException
    at java.sql.Date.valueOf(Date.java:276)
    at cxren.model.dao.AlunoDAO.somarValoresIdades(AlunoDAO.java:115)
    at cxren.controller.FXMLAnchorPaneCadastroAlunosController.setarSomaValorIdades(FXMLAnchorPaneCadastroAlunosController.java:129)
    at cxren.controller.FXMLAnchorPaneCadastroAlunosController.initialize(FXMLAnchorPaneCadastroAlunosController.java:73)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
    ... 66 more
Tipo da erro de NullPointer na Data. O que eu to fazendo na hora de somar (e acho q aqui ta o erro) e usando o setIdade da classe DAO como um meio de salvar o SUM do banco e depois mostra-lo na caixa de texto. Poderia me ajudar? Tipo se existe um outro modo de guardar numa variavel e depois converter para String e setar na caixa de texto? Desde já obrigado! E obrigado pelo SUM do MySQL. []´s Ricardo. Observação: TUDO JDBC.. nada de JPA.
L

rickzale,

vamos corrigir algumas coisas…

primeiro, no seu método public Aluno somarValoresIdades(Aluno aluno), eu não sei se a sua query teria retornado, mas seria ideal você trocar:

stmt.setDate(2, Date.valueOf(aluno.getData()));
para
stmt.setDate(1, Date.valueOf(aluno.getData()));

Esse número que é utilizado representa a posição do atributo representado pela interrogação na query que você deseja setar. Se você tem 3 interrogações, você seta a primeira com 1, a segunda com 2 e assim por diante.

Ainda nesse método, você roda a query, faz o tratamento do valor retornado e captura
retorno = despesa
Imagino que seja um objeto global que não é tratado pelo método. Sendo que segue o return retorno;

Por fim, no método public Aluno somarValoresIdades(Aluno aluno), a linha alunoDAO.setarSomaValorIdades(aluno); chama o método do alunoDAO que retorno um objeto do tipo Aluno, mas como está não o retorna para nenhum objeto. Algo como (no pior caso):

aluno = alunoDAO.setarSomaValorIdades(aluno);

O erro proposto pelo log refere-se à linha

stmt.setDate(2, Date.valueOf(aluno.getData()));

O aluno que está sendo enviado para o alunoDAO está com a data nula. Precisa verificar como ele está sendo carregado. Seria bom você ir debugando para verificar como estão carregados os objetos.

Falows

R

Logusmao

Então… esse caso do stmt.setDate(2,…) era uma falha mesmo. Já consertei. Obrigado.
Mas ainda continua dando erro de NullPointer na hora de conseguir a data. Cenário: no banco esta Date. E na classe Aluno esta

// inicio.... private int idAluno; private LocalDate data; private String nome; //e os getters e setters...
mas e tenho um datePicker do JavaFX QUE É NELE que o usuário vai escolher a data e depois disso vem a soma das idades do banco. O problema acho que ta na hora de converter porque no AlunoDao esta assim:

//inicio... ... stmt.setDate(1, Date.valueOf(despesa.getData())); ... //continua
E o erro na hora de executar de NULL vem dessa parte do método. Seria caso de adicionar uma váriavel de inicialização também (além do Aluno aluno) uma do tipo Date? Eu fui obrigado a colocar no Aluno a data com LocalDate porque não tinha como dar o valueOf sem que fosse assim. Essa aplicação vai usar para TUDO datas como meio de se “localizar”. Tudo praticamente precisa da data.
Obrigado pelos conselhos. O que vc poderia me ajudar agora com relação a data? Por hora (só pra debugar) vou criar um

public Aluno MostraData(Aluno aluno, Date data){ //vai tudo que precisa
para ver o que ocorre.
Obrigado.

L

rickzale,

O tratamento de datas é meio enjoado mesmo, mas nunca precisei usar o LocalDate para isso. Vamos pensar algumas soluções:

A primeira, se data for do tipo Date a linha ficaria

stmt = setDate(1, despesa.getData());

No pior dos casos, você poderia um Calendar, e faria

stmt = setDate(1, despesa.getData().getTime());

Do jeito que está, talvez poderia fazer um

`stmt = setDate(1, Date.from(despesa.getData().atStartOfDay(ZoneId.systemDefault().toInstant())))

Mas o problema real é que existe um nullPointerException… esse problema está ao instanciar o objeto. O local onde o usuário preenche essa data você já verificou se está capturando corretamente a informação? O problema não é criar um mecanismo de inicialização… é identificar se os dados estão sendo transmitidos corretamente. Seria bom verificar essa parte do código para ver se a captura está ocorrendo corretamente.

Para debugar, não precisa criar um novo método. Pelo contrário, é ideal você utilizar os métodos citados acima… Você está usando alguma IDE?

Falows

R

Cara obrigado mesmo pelas ajudas. Eu uso Eclipse e também NetBeans (mais o NetBeans porque também me dá um suporte excelente para Swing). Eu andei lendo umas coisas sobre a classe LocalDate e já consegui ver alguns erros meus. O fato é que descobri o motivo do nullPointer: Para que ele some as idades e mostre na tabela, o usuário tem que selecionar num DatePicker do JavaFX a data. Dai no metodo AlunoDAO ele tem lá o

stmt.setDate(1, Date.valueOf(despesa.getData())); mas nao sei se vou precisar passar isso como parametro (public Aluno somarValoresIdades(Aluno aluno, LocalDate data) para que consiga recuperar.
Depois que o usuario selecionar no datePicker, o metodo mostra as idades somadas numa parte da tabela. Simples. Mas acho que nao to conseguindo é PASSAR isso na hora de chamar o metodo no controller da View, que seria public void setarSomaValorIdades(Aluno aluno).
Se tiver que passar por parametro no DAO, tera que ter também no controller, certo?

Mais uma vez obrigado. Abraços.

R

O amigo **C0deuniversal** me ajudou num outro post com o datePicker do JavaFX.

O que eu consigo fazer que pode me ajudar:
meudatePicker.getValue();

meudatePicker.setValue(LocalDate.now());

meudatePicker.setValue(LocalDate.of(2016,06,21));

//também da para armazenar

LocalDate dt = meudatePicker.getValue();
System.out.println(dt);
Mas a dor de cabeça é que ainda NÃO ENXERGUEI COMO pegar isso do datePicker e passar para o método que vai somar as idades. E também no se o método (acima) está correto. Que o _NullPointerException_ é em função da data NULA isso me ficou claro. Mas não sei se solicito isso como parâmetro do método no AlunoDAO e na classe View e no Controller como PEGAR a data, colocar na chamada do método no Controller e depois.... bom depois e penso. Obrigado a quem esta pelo menos lendo e também ao **Logusmao**, **C0deuniversal** e **thiagokrathos**.
R

Logusmao Desculpe muito tempo sem responder (a patroa ta grávida, então to com a cabeça na Lua…) Enfim… algumas coisas progrediram e eu deixei por ora a questão da Idade e to focando numa coisa mais complexa agora. As despesas que um aluno pode ter/utilizar. Os métodos são mesmo parecidos e vou pedir sua ajuda no seguinte:
A classe despesa.java tem o seguinte bem básico:

private LocalDate data;
    private double valor;

//getters e setters
    public LocalDate getData() {
        return data;
    }

    public void setData(LocalDate data) {
        this.data = data;
    }
    public double getValor() {
        return valor;
    }

    public void setValor(double valor) {
        this.valor = valor;
    }

A classe DespesaDAO.java

//inicio e imports necessários a conexão com Banco 

//metodo para somar as Despesas
 public Despesa somarValoresDespesa(Despesa despesa, LocalDate data){
        String sql = "SELECT SUM(valor) FROM despesa WHERE valor IS NOT NULL AND data=?";
        //double soma = 0.0;
        Despesa retorno = new Despesa();
        data = despesa.getData();
        try{
            PreparedStatement stmt = conexao.prepareStatement(sql);
            stmt.setDate(1, Date.valueOf(data));//Estava "Date.valueOf(data)"
            ResultSet resultado = stmt.executeQuery();
            while (resultado.next()){
               double soma = resultado.getDouble(1);
               despesa.setValor(soma);
               retorno = despesa;
            }
        }catch (SQLException ex){
            Logger.getLogger(DespesaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return retorno;
    }

A classe FXMLAnchorPaneCadastroDespesaController.java

@FXML
    public void Teste() throws IOException {
     // passei os parametros aqui na unha q estava tendo problemas ao passar no Teste(despesa, data)
   Despesa despesa = new Despesa();
        LocalDate data = dtData.getValue();
        if(data != null){
            despesa = despesaDAO.somarValoresDespesa(despesa, data);
            txValorTotalDespesas.setText(String.valueOf(despesa.getValor()));
            System.out.println(despesa);
        } else {
            dtData.setValue(LocalDate.now());
            txValorTotalDespesas.setText(" ");
        }
    }

E agora o seguinte. Até aqui ta legal. Abre para o usuario efetuar 2 ações: 1ª Selecionar a data via datePicker (dtData) e por fim tem um botão com a ação para puxar a query do banco (via despesaDAO) e mostrar no textfield.
Depois de selecionado no datePicker e clicado no botão da essa exceção:

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Node.fireEvent(Node.java:8411)
    at javafx.scene.control.Button.fire(Button.java:185)
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:380)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:294)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:416)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:415)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
    at com.sun.glass.ui.View.notifyMouse(View.java:937)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
    ... 48 more
Caused by: java.lang.NullPointerException
    at java.sql.Date.valueOf(Date.java:276)
    at cxren.model.dao.DespesaDAO.somarValoresDespesa(DespesaDAO.java:117)
    at cxren.controller.FXMLAnchorPaneCadastroDespesaController.Teste(FXMLAnchorPaneCadastroDespesaController.java:140)
    ... 58 more

Da erro aqui

Acredito que seja na hora de converter de LocalDate para sql Date. Dá erro de NullPonterException, como se tivesse puxando nada do banco (mas esta plenamente populado). Alguma sugestão?

Desde já obrigado.

R

Resolvi o problema de execução na hora de clicar no botão que tem a chamada do método. Mas agora continua dando erro de NULLPOINTER ao chamar o metódo somarValoresDespesa.

Como fazer para passar isso na hora de executar a query? Por que será o erro de nullpointer (tem datas cadastradas no banco)???
Isso que eu pretendo é possível? Alguem ja teve esses problemas com data, java e mysql? Poderia dizer se resolveu e como resolveu? Ficaria muito agradecido se alguem puder me ajudar. O projeto é para uma causa social que vai ajudar diversas famílias entre crianças e adoslecentes. Abraços.

Criado 15 de junho de 2016
Ultima resposta 6 de jul. de 2016
Respostas 15
Participantes 4