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
publicList<Entidade>listar(){
List<Entidade>rel=null;try{
Queryquery=em.createQuery("Select e From Entidade e");rel=query.getResultList();}catch(Exceptione){
e.getMessage();}
returnrel;}
essa consulta esta me retornando todos os registros
A interface ResultSet, tem um metodo que retorna o primeiro registro.
first()
Boa sorte.
E
e_novaski
Boa noite, Fexx
desculpe mas nao consegui encontrar nada a esse respeito a unica funcao q encontrei foi getFirstResult(); mas nao me retornou nada
publicEntidadeprimeiro(){
Entidadeentidade=null;Integercodigo;try{
Queryquery=em.createQuery("Select e From Entidade e");codigo=query.getFirstResult();entidade=em.find(Entidade.class,codigo);}catch(Exceptione){
e.getMessage();}
returnentidade;}
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
e_novaski
Bom dia, DarthCego
muito obrigado pela ajuda.
ficou da maneira que eu precisava abaixo codigo de como ficou
publicEntidadeprimeiro(){
Entidadeentidade=null;try{
Queryquery=em.createQuery("Select e From Entidade e");List<Entidade>rel=query.getResultList();entidade=rel.get(0);}catch(Exceptione){
e.getMessage();}
returnentidade;}
publicEntidadeultimo(){
Entidadeentidade=null;try{
Queryquery=em.createQuery("Select e From Entidade e");List<Entidade>rel=query.getResultList();entidade=rel.get(rel.size()-1);}catch(Exceptione){
e.getMessage();}
returnentidade;}
publicEntidadeanterior(Integercodigo){
Entidadeentidade=null;try{
Queryquery=em.createQuery("Select e From Entidade e Where e.iEntidade < "+codigo);List<Entidade>rel=query.getResultList();entidade=rel.get(rel.size()-1);}catch(Exceptione){
e.getMessage();}
returnentidade;}
publicEntidadeproximo(Integercodigo){
Entidadeentidade=null;try{
Queryquery=em.createQuery("Select e From Entidade e Where e.iEntidade > "+codigo);List<Entidade>rel=query.getResultList();entidade=rel.get(0);}catch(Exceptione){
e.getMessage();}
returnentidade;}
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:
publicList<Cidade>proximo(){List<Cidade>lista=newArrayList<Cidade>();try{pstmt=con.prepareStatement("select * from cidade");rs=pstmt.executeQuery();Cidadecidade=newCidade();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(Exceptione){System.out.println("Erro: "+e.getMessage());}returnlista;}
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.
publicEntidadeprimeiro(){Entidadeentidade=null; Integercodigo; try{Queryquery=em.createQuery("Select e From Entidade e order by id ASC"); codigo=query.getFirstResult(); query.setMaxResult(1);entidade=em.find(Entidade.class,codigo); }catch(Exceptione){e.getMessage(); }returnentidade;
}