Selecionar o primeiro registro do banco Mysql

8 respostas
E

Boa noite,

Estou tentando criar em meu projeto os botoes (Primeiro, Anterior, Proximo e Ultimo) e gostaria de saber como obter essas informações com persistence e mysql eu jah tentei usar o Limit 1 no sql mas nao deu certo

public List<Entidade> listar() {
        List<Entidade> rel = null;
        try {
            Query query = em.createQuery("Select e From Entidade e");
            rel = query.getResultList();
        } catch (Exception e) {
            e.getMessage();
        }
        return rel;
    }

essa consulta esta me retornando todos os registros

8 Respostas

Fexx

A interface ResultSet, tem um metodo que retorna o primeiro registro.

first()

Boa sorte.

E

Boa noite, Fexx

desculpe mas nao consegui encontrar nada a esse respeito a unica funcao q encontrei foi getFirstResult(); mas nao me retornou nada

public Entidade primeiro(){
        Entidade entidade = null;
        Integer codigo;
        try{
            Query query = em.createQuery("Select e From Entidade e");
            codigo = query.getFirstResult();
            entidade = em.find(Entidade.class, codigo);
        }catch(Exception e){
            e.getMessage();
        }
        return entidade;
    }

vc poderia me explicar melhor

grato

DarthCego

Ola amigo

voce pode fazer essas ações com a propria List que voce retorna do banco e como vc faz um select de todos os elementos do banco ela vai vir ordenada pelo codigo então

para pegar o primeiro elemento use

para pegar o ultimo da lista

Abraços

edu_fernandes

Pra vc criar um SQL que retorne apenas o primeiro registro você deve usar:

SELECT (*) FROM base.tabela 
ORDER BY (coluna) ASC 
LIMIT 1

(Achei estranho pois disse que não funcionou usando LIMIT. Ele não trouxe resultado algum ou gerou um erro no SQL?)

Para pegar o último valor na base a idéia é a mesma:

SELECT (*) FROM base.tabela 
ORDER BY (coluna) DESC 
LIMIT 1

Não sou muito a favor de trazer para o código coisas que o banco pode realizar, como essas pesquisas simples mesmo para retornar um primeiro valou ou o último valor, até por que se sistema, não deve possuir milhões de registros com acesso concorrente para prejudicar o desempenho ou algo deste tipo.

Espero ter ajudado.

Boa sorte com seus estudos!

E

Bom dia, DarthCego

muito obrigado pela ajuda.

ficou da maneira que eu precisava abaixo codigo de como ficou

public Entidade primeiro() {
        Entidade entidade = null;
        try {
            Query query = em.createQuery("Select e From Entidade e");
            List<Entidade> rel = query.getResultList();
            entidade = rel.get(0);
        } catch (Exception e) {
            e.getMessage();
        }
        return entidade;
    }
    
    public Entidade ultimo() {
        Entidade entidade = null;
        try {
            Query query = em.createQuery("Select e From Entidade e");
            List<Entidade> rel = query.getResultList();
            entidade = rel.get(rel.size() - 1);
        } catch (Exception e) {
            e.getMessage();
        }
        return entidade;
    }

    public Entidade anterior(Integer codigo) {
        Entidade entidade = null;
        try {
            Query query = em.createQuery("Select e From Entidade e Where e.iEntidade < " + codigo);
            List<Entidade> rel = query.getResultList();
            entidade = rel.get(rel.size() - 1);
        } catch (Exception e) {
            e.getMessage();
        }
        return entidade;
    }

    public Entidade proximo(Integer codigo) {
        Entidade entidade = null;
        try {
            Query query = em.createQuery("Select e From Entidade e Where e.iEntidade > " + codigo);
            List<Entidade> rel = query.getResultList();
            entidade = rel.get(0);
        } catch (Exception e) {
            e.getMessage();
        }
        return entidade;
    }

agora eu queria tirar mais uma duvida

quando eu clico no botao anterior ou proximo e ele ultrapassa o ultimo registro ele me traz vazio o formulario. eu gostaria que quando nao tivesse mais para trazer ele me desse sempre o ultimo registro…

grato

Fexx

Assim, ele avança até quando não tem mais registros.

Vc pode fazer assim:

public List<Cidade> proximo() {
		List<Cidade> lista = new ArrayList<Cidade>();
		try {
			pstmt = con.prepareStatement("select * from cidade");
			rs = pstmt.executeQuery();
			Cidade cidade = new Cidade();
			if (!rs.last()) {
			rs.next();
			}
			cidade.setCodigo(rs.getInt("codigo"));
			cidade.setNome(rs.getString("nome"));
			cidade.setUf(rs.getString("uf"));
			
			System.out.println(lista.add(cidade));
			
		} catch (Exception e) {
			System.out.println("Erro: " + e.getMessage());
		}
		return lista;

	}

Assim ele só avança, se for diferente do ultimo. vc pode fazer isso com os demais.

Boa sorte.

edu_fernandes

e_novaski uma observação apenas.

Como citei sou contra de você trazer algumas ações para o programa que o SGBD pode realizar tranquilamente.

Seu método primeiro() retorna todos os registro em seu SQL, veja bem, isso é totalmente desnecessário, tendo em vista que quer apenas o primeiro assim como o método ultimo(). Apenas uma pequena sugestão para melhorar sua aplicação, mas já visando desempenho, até por que você alimenta uma lista, com n valores para pegar apenas um entende? A sugestão de SQL que dei pode resolver isto tranquilamente.

Boa sorte com seu programa.

Espero que possa ter lhe ajudado.

kleins

Ai vai…

Ordene ASC ou DESC e use o setMaxResult…

Ai vc pega apenas um registro sem trazer a lista toda para a memória pra depois escolher apenas um… Isso é terrivel para performance.

public Entidade primeiro(){  
    Entidade entidade = null;  
    Integer codigo;  
    try{  
        Query query = em.createQuery("Select e From Entidade e order by id ASC");  
        codigo = query.getFirstResult(); 
        query.setMaxResult(1);
        entidade = em.find(Entidade.class, codigo);  
    }catch(Exception e){  
        e.getMessage();  
    }  
    return entidade;  
}

Abs

Criado 11 de fevereiro de 2012
Ultima resposta 14 de fev. de 2012
Respostas 8
Participantes 5