selectOneMenu puxar dados do banco

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.

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

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?

Amigo estou usando o JSF 1.2

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 há um construtor em SelectItem que recebe o value e o label
}

Blz?

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!!!

[quote=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!!![/quote]

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?

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!

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

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

[quote=walacy]Coloca a lista de “SelectItem” no back bean e chama ela.

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

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

Que erro ocorreu, 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?

veja aqui:

meu arquivo .jsf

<input jsfc="h:selectOneMenu" value="#{controllerUser.usuario.funcao}" > <f:selectItems value="#{controllerCargo.cargos}" />

controller:

[code]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;
}
}
[/code]

classe cargodao

[code]//retorna todos os cargos cadastrados
public List listaCargo(){
Query query = getSession().createQuery(“from Cargo”);
Listlista = query.list();

	return lista;
}[/code]

flw! espero ter ajudado

[quote=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?[/quote]

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…

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?

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