selectOneMenu puxar dados do banco

14 respostas
D

Olá galera estou desenvolvendo um pequeno sistema com JSF e HIBERNATE e queria saber,
como faço para puxar dados do banco para um selectOneMenu,
ex: tenho um campo cliente no banco de dados, e queria puxar todos eles em um selectOneMenu.

14 Respostas

groff

Opa…
Pelo que eu entendi vc quer selecionar um campo de uma tabela puxando todos os dados desse campo, é isso?
Se for, se eu não me engano por comando de banco de dados você consegue.

SELECT FROM

Ex.: SELECT cliente FROM cadastros

Espero ter ajudado.

Senão for isso avisa ai.

Abraço

alias

Acho que a duvida do colega é exibir o retorno do select na pagina, nesse componente que ele citou…correto?

Se sim…qual a versao do jsf voce está utilizando?

D

Amigo estou usando o JSF 1.2

alias

ok…nesse caso voce deve fazer o seguinte…

<h:selectOneMenu>
    <f:selectItems value="#{seubean.propriedade}" />
</h:selectOneMenu>

essa propriedade do seu bean deve retornar um List (javax.faces.model.SelectItem)

Essa classe SelectItem possui dois atributos que voce pode usar, value e label. Então voce pode preencher, pra cada um dos registros que serão exibidos no seu combo, o valor oculto e o label (valor exibido no select) correspondente…

Um exemplo simples de preenchimento desse cara:

List<Cliente> clientes = ClasseQueRetornaUmaListaDeClientes.getList();
List<SelectItem> items = new ArrayList<SelectItem>();

for (Cliente c : clientes){
   SelectItem  s = new SelectItem();
   s.setValue(c.getIdCliente());
   s.setLabel(c.getNomeCliente());
   items.add(s);

   //tambem  um construtor em SelectItem que recebe o value e o label
}

Blz?

D

alias não entendi muito bem, mais eu tenho uma entidade Cliente e tenho uma classe ClienteBean,
que tem:

public class ClienteBean {

private Cliente cliente = new Cliente();
private UIData objeto;

    //gets e sets
    
    public List<Cliente> getLista(){ //metodo para mostrar dados na tabela                    
	Session session = HibernateUtil.getSession();
	Query q = session.createQuery("from Cliente");
	return q.list();
}

  //metodo salvar

}
e tenho esse metodo que é uma lista de cliente para mostrar os dados do cliente na tabela e está mostrando,
mais não entendi como fazer, se puder me ajudar mais uma vez ficarei grato!!!

alias

danielll20:
alias não entendi muito bem, mais eu tenho uma entidade Cliente e tenho uma classe ClienteBean,
que tem:

public class ClienteBean {

private Cliente cliente = new Cliente();
private UIData objeto;

    //gets e sets
    
    public List<Cliente> getLista(){ //metodo para mostrar dados na tabela                    
	Session session = HibernateUtil.getSession();
	Query q = session.createQuery("from Cliente");
	return q.list();
}

  //metodo salvar

}
e tenho esse metodo que é uma lista de cliente para mostrar os dados do cliente na tabela e está mostrando,
mais não entendi como fazer, se puder me ajudar mais uma vez ficarei grato!!!

entao mano tá quase lá… :lol: .Vamos lá…duas duvidas, esse seu ClienteBean é o managed bean, correto?Se sim, esse variavel do tipo UIData é o select que deve receber os dados?

No caso da primeira duvida estar correta (estou perguntando sobre o UIData, pq aí voce poderia fazer diferente, mas enfim), voce pode fazer assim:

import javax.faces.model.SelectItem

public class ClienteBean {
   private List<SelectItem> items;

   public ClienteBean(){
      items = new ArrayList<SelectItem>();
   }

   public List<SelectItem> getItems(){
        Session session = HibernateUtil.getSession();
        Query q = session.createQuery("from Cliente");
        List<Cliente> clientes = q.list(); 

        for  (Cliente c : clientes){  
              SelectItem  s = new SelectItem();  
              s.setValue(c.getIdCliente());  
              s.setLabel(c.getNomeCliente());  
             items.add(s);  
       }  
       return items;
   }

}

na sua pagina jsf, jsp, xhtml, ou o que for…voce coloca o seu select, puxando os dados desse managed-bean

<h:selectOneMenu>  
      <f:selectItems value="#{seubean.propriedade}" />  
 </h:selectOneMenu>

blz?

D

Alias, minha classe ClienteBean está assim:

private List items;

public  ClienteBean(){  
    items = new ArrayList<SelectItem>();  
 }  
 
  public  List<SelectItem> getItems(){  
	   Session session = HibernateUtil.getSession();  
	   Query q = session.createQuery("from Cliente");  
	   List<Cliente> clientes = q.list();   
	    
	   for  (Cliente c : clientes){    
	         SelectItem  s = new SelectItem();    
	         s.setValue(c.getId());    
	         s.setLabel(c.getNome());    
	         items.add(s);    
	   }    
	  return items;  
   }

e meu jsp está assim:

<h:selectOneMenu>
<f:selectItems value="#{clienteBean.items}" />
</h:selectOneMenu>

e mesmo assim da erro!

walacy

Coloca a lista de “SelectItem” no back bean e chama ela.

O f:selectItems só recebe se for uma lista de “SelectItem”.

alias

walacy:
Coloca a lista de “SelectItem” no back bean e chama ela.

O f:selectItems só recebe se for uma lista de “SelectItem”.

Sim, é isso que deve ser feito…eu devo estar explicando muito mal :lol:

Que erro ocorreu, danielll20

D

alias, obrigado pela paciencia comigo, mais é por que sou iniciante, e eu consegui popular o selectOneMenu com os dados do banco,
como vc me disse só que agora depois de ter listado, eu não estou conseguindo salvar esses dados como faço?

LPJava

veja aqui:

meu arquivo .jsf
<input jsfc="h:selectOneMenu" value="#{controllerUser.usuario.funcao}" >
				<f:selectItems value="#{controllerCargo.cargos}" />
controller:
public class ControllerCargo {
	private Cargo cargo;
	private Map<String, Object> cargoitem=null;
	private ListDataModel model; 

//armazenado no select
	public Map<String, Object> getCargos(){
			CargoDAO cargodao = new CargoDAO(); 
			cargoitem = new LinkedHashMap<String, Object>();
			for(Iterator iter =cargodao.listaCargo().iterator();iter.hasNext();){
			 Cargo c = (Cargo) iter.next();
				cargoitem.put(c.getFuncao(), c.getFuncao());
			}
		return cargoitem;
	}
}
classe cargodao
//retorna todos os cargos cadastrados
	public List listaCargo(){
		Query query = getSession().createQuery("from Cargo");
		List<Cargo>lista = query.list(); 
		
		return lista;
	}

flw! espero ter ajudado

alias

danielll20:
alias, obrigado pela paciencia comigo, mais é por que sou iniciante, e eu consegui popular o selectOneMenu com os dados do banco,
como vc me disse só que agora depois de ter listado, eu não estou conseguindo salvar esses dados como faço?

que bom, já podemos colocar um RESOLVIDO no titulo do tópico :lol:

agora voce quer salvar o que foi selecionado no combo, é isso?Bom basta voce associar a propriedade “value” do h:selectOneMenu com algum atributo do seu bean, ou caso seja um cadastro, criar uma classe bean que encapsule esses campos…e depois salvar o bean. Como voce está usando JPA fica fácil…

L

Olá pessoal!

Estou estudando hibernate e tenho uma dúvida relacionada a este tópico.
Alguem pode de dar uma dica?

Aproveitando um exemplo semelhante ao código do nosso amigo LPJava:

] public List lista() { Query query = getSession() .createQuery("select "+ String1 + ", "+ String2 +"from "+String3); // <============ minha dúvida List<T>lista = query.list(); return lista; }

Ternho que preencher de alguma forma String1(nome do meu id na tabela), String2 (descrição do combo) e String3(Nome da minha tabela).
Estas 2 primeiras strings representam os campos que quero inserir no meu MapItem (Map<String, Object> ).
A função acima é chamada popular o MapItem (Map<String, Object> ) :

for(Iterator iter =comboDAO.lista().iterator();iter.hasNext();){  
              <T> c =  iter.next<T>();  
                 MapItem.put(c.getFuncao(), c.getFuncao());  //<=================== dúvida
             }

Mas como falamos de uma classe genérica, para cada T (que é uma entidade), pode existir um nome de coluna para Id e nome de
Descrição diferentes (por exemplo NOME_COLUNA_ID e NOME_COLUNA_DESCRIÇÃO).
Ou seja, esta classe generica deve receber por parametro o nome dos campos que devem ser buscados no meu objeto T.
Estes Ids e Descrições (campos que quero) seriam o que eu gostaria de passar à função
MapItem.put( String , String ), só que na forma de String. Algo semelhante a isso:

MapItem.put( c.NOME_COLUNA_ID, NOME_c.COLUNA_DESCRIÇÃO );

Mas da forma exemplificada acima não funciona. Existe uma outra forma para fazer isso?
Alguem teria uma dica?

Matheus_Paiva

pessoal estou com um problema parecido com esse aqui …
será que alguem pode ajudar ?

Criado 17 de maio de 2010
Ultima resposta 18 de jul. de 2012
Respostas 14
Participantes 7