Percorrer registros no banco de dados

3 respostas
blackfalcon

Bem pessoal, sou iniciante ainda no hibernate, entoa nao sei se essa é a melhor maneira. Ate perguntei isso aqui ja, mas o que o amigo disse nao me serviu, entao fui eu mesmo inventar...

Bem, eu aprendi a pegar os dados do hibernate em List. Porem, isso pra mim nao serve. Vou dizer porque.

1 - Software sera interligado pela internet, entao puxar uma lista inteira nao é legal, ainda mais que os dados ficariam cada um de uma maneira. E me falaram sobre usar @Version (ainda nao aprendi a usar anotation tambem..), mas pelo o que me disseram, se um usuario modifica algo no db, a versao muda e o outro nao consegue mais gravar, entao tem que pegar o List inteiro novamente. Isso seria ainda pior hehe

2 - Usar List para pegar os dados é muito ruim, alem desse motivo da internet e tambem porque sobrecarrega muito o computador, muito espaço perdido a toa, porque as vezes a pessoa nao vai utilizar tudo o que tem na List. Por exemplo, sobre ir pro primeiro registro, proximo registro, registro anterior, e ultimo, eu preciso carregar a List inteira, entao isso ja nao serviria tambem, porque as vezes a pessoa nem vai ver muita coisa..

Entao o que eu fiz, reinventei minha propria roda. Nao sei se foi a melhor maneira, se existe algo ja feito parecido com isso. Mas veja so no codigo abaixo:

Estou usando esse metodo para listar o conteudo:

public void atualizarDados() {
        try {
            List<String> listIdInicial = SessionDataBase.getSession().createSQLQuery("SELECT codigo FROM tb01 order by codigo asc limit 1").list();
            int idInicial = Integer.parseInt(listIdInicial.get(0));
            this.idInicial = idInicial;
            List<String> listIdFinal = SessionDataBase.getSession().createSQLQuery("SELECT codigo FROM tb01 order by codigo desc limit 1").list();
            int idFinal = Integer.parseInt(listIdFinal.get(0));
            this.idFinal = idFinal;

            BeanCadastrarProduto cadastrarProduto = (BeanCadastrarProduto) SessionDataBase.getSession().get(BeanCadastrarProduto.class, String.valueOf(idAtual));
            txt_Codigo.setText(cadastrarProduto.getCodigo());
            txt_DescricaoProduto.setText(cadastrarProduto.getDescricaoProduto());
            txt_DescricaoAbreviada.setText(cadastrarProduto.getDescricaoAbreviada());
            box_Unidade.setSelectedItem(cadastrarProduto.getUnidade());
            box_SituacaoProduto.setSelectedIndex(cadastrarProduto.getSituacao() - 1);
            box_TipoVenda.setSelectedItem(cadastrarProduto.getTipo() - 1);
            txt_Marca.setText(cadastrarProduto.getMarca());
            txt_Tamanho.setText(cadastrarProduto.getTamanho());
            txt_Peso.setText(cadastrarProduto.getPeso());
            txt_Cor.setText(cadastrarProduto.getCor());
            txt_Grupo.setText(String.valueOf(cadastrarProduto.getGrupo()));
            txt_Subgrupo.setText(String.valueOf(cadastrarProduto.getSubgrupo()));
            box_DepartamentoFiscal.setSelectedIndex(cadastrarProduto.getDepartamentoFiscal() - 1);
            txt_PorcentagemIVA.setText(String.valueOf(cadastrarProduto.getPorcentagemIVA()));
            box_PIS.setSelectedItem(cadastrarProduto.getPIS());
            box_COFINS.setSelectedItem(cadastrarProduto.getCOFINS());
            txt_ComissaoVendedor.setText(String.valueOf(cadastrarProduto.getComissao()));
            txt_DescontoMaximoItem.setText(String.valueOf(cadastrarProduto.getDescontoMaximo()));
            ftxt_PrazoValidade.setText(cadastrarProduto.getPrazoValidade());

            txt_PrazoGarantia.setText(cadastrarProduto.getPrazoGarantia());
            txt_LocalFisico.setText(cadastrarProduto.getLocalFisico());
            ftxt_DataCadastro.setText(cadastrarProduto.getDataCadastro());
            ftxt_DataSaiudeCirculacao.setText(cadastrarProduto.getDataSaiuDeCirculacao());
            ftxt_DataUltimaAlteracao.setText(cadastrarProduto.getDataUltimaAlteracao());
            txt_UsuarioUltimaAlteracao.setText(cadastrarProduto.getUsuarioUltimaAlteracao());
            if (cadastrarProduto.getProdutoPesado() == 0) {
                cbox_ProdutoPesado.setSelected(false);
            } else {
                cbox_ProdutoPesado.setSelected(true);
            }
            if (cadastrarProduto.getAceitaCondicional() == 0) {
                cbox_AceitaCondicional.setSelected(false);
            } else {
                cbox_AceitaCondicional.setSelected(true);
            }
            if (cadastrarProduto.getSairTabelaPreco() == 0) {
                cbox_SairPesquisaProdutos.setSelected(false);
            } else {
                cbox_SairPesquisaProdutos.setSelected(true);
            }

            //Precisa disso caso for atualizado em um terminal, no outro tambem é
            SessionDataBase.getSession().clear();
            cadastrarProduto = null;
            //SessionDataBase.getSession().getTransaction().begin();
            //SessionDataBase.getSession().getTransaction().commit();
            idExiste = true;
        } catch (java.lang.IndexOutOfBoundsException ex) {
            desativarCampos();
            idExiste = true;
        } catch (java.lang.NullPointerException ex){
            idExiste = false;
        }

    }

Veja que nele, eu defino o idInicial e idFinal para percorrer. Porque isso, porque no db vai ter um campo id que sera criado a cada registro salvo.

E nos botoes primeiro, anterior,proximo,ultimo eu tenho o seguinte:

private void btn_PrimeiroActionPerformed(java.awt.event.ActionEvent evt) {                                             
        idAtual = idInicial;
        atualizarDados();
        txt_Codigo.setEnabled(false);
    }
    
    private void btn_ProximoActionPerformed(java.awt.event.ActionEvent evt) {                                            
        if (idAtual != idFinal) {
            boolean teste = true;
            while(teste){
                idAtual++;
                atualizarDados();
                if(idExiste){
                    teste = false;
                }
            }
        }

        txt_Codigo.setEnabled(false);
    }       

private void btn_UltimoActionPerformed(java.awt.event.ActionEvent evt) {                                           
        try {
            idAtual = idFinal;
            atualizarDados();
        } catch (java.lang.IndexOutOfBoundsException ex) {
            idAtual = idInicial;
        }
        txt_Codigo.setEnabled(false);
    }                                          

    private void btn_AnteriorActionPerformed(java.awt.event.ActionEvent evt) {                                             
        if (idAtual != idInicial) {
            boolean teste = true;
            while(teste){
                idAtual--;
                atualizarDados();
                if(idExiste){
                    teste = false;
                }
            }
        }
        
        txt_Codigo.setEnabled(false);
    }

Entao tipo, estou conseguindo percorrer meu banco normal.

Porem, gostaria de saber se essa é a melhor maneira de fazer isso, pensando sempre que o sistema sera usado pela internet, entao os dados devem ir um por vez, ao inves de mais.

Outra coisa tambem, acredito que seja erro de logica, ate porque estou pegando os dados da instancia do Bean. Gostaria de saber o porque se eu tirar a linha 'cadastrarProduto = null;' la do metodo atualizar, porque mesmo excluindo o registro ele ainda continua passando por ele?

Por enquanto isso galera, se alguem poder me ajudar, ficarei muito grato!

Abraços

3 Respostas

Leozin

Se você não quiser pegar a lista inteira de uma query, é só páginar:

Crie a sua query e faça um setFirstResult(x) e setMaxResults(y).

Ps.: List não é ruim. Você só terá problemas de memórias se tu tiveres que retornar MUITOS objetos do banco, não precisa se preocupar com isso. E outra, logo depois que você lê a tua list, o Java fica responsável de jogar isso fora (espero que você não tenha colocado esses dados numa sessão da web da vida) =)

blackfalcon

Então, nao é web nao, é desktop mesmo.

So que eu gostaria de limitar pra apenas um conteudo por vez na lista, mas se eu fizer isso, nao conseguirei ir para ultimo registro, anterior, proximo e tals… correto?

Abraços

Leozin

blackfalcon:
Então, nao é web nao, é desktop mesmo.

So que eu gostaria de limitar pra apenas um conteudo por vez na lista, mas se eu fizer isso, nao conseguirei ir para ultimo registro, anterior, proximo e tals… correto?

Abraços

Claro que consegue, pense comigo:

Você tem 240 registro de resposta. Se você quiser ir 1 por 1, você vai ter que pensar num esquema de paginação, digamos, mais lógico, tipo:

int paginaAtual = 1; int objetosPorPagina = 10;

Aqui nesse caso, você teria que fazer o seguinte

// Nesse caso, estamos imaginando que a página 0 existe ;p query.setFirstResult(paginaAtual * objetosPorPagina); query.setMaxResults(objetosPorPagina);

nesse caso, estamos pegando os objetos 11, 12, 13… até o o 20

para o 1 por 1, o objetorPorPagina seria 1 e você teria nada mais nada menos que… 240 páginas.

Criado 27 de agosto de 2010
Ultima resposta 1 de set. de 2010
Respostas 3
Participantes 2