Popular <p:selectOneMenu> [Resolvido]

,

tenho minha pagina que precisa popular um <p:selectOneMenu> com uma lista com valores do banco.

<ui:composition xmlns=“http://www.w3.org/1999/xhtml
xmlns:h=“http://java.sun.com/jsf/html
xmlns:f=“http://java.sun.com/jsf/core
xmlns:ui=“http://java.sun.com/jsf/facelets
xmlns:p=“http://primefaces.org/ui”>

	<f:metadata>
		<f:event listener="#{cadastroClienteBean.init}" type="preRenderView" />
	</f:metadata>

	<h:outputStylesheet library="css" name="sistema.css" />

	<p:panelGrid columns="2"
		style="width:30%; text-align: left;  margin: 0 auto; margin-top: 20px; "
		columnClasses="rotulo, campo, rotulo, campo">

		<p:outputLabel value="Nome Vendedor" for="vendedor" />
		<p:selectOneMenu style="width: 230px" id="vendedor">
			<f:selectItem itemLabel="Selecione o Vendedor" />
			<f:selectItems value="#{cadastroClienteBean.listaVendedores}"
				var="vendedor" itemValue="#{vendedor}" />
		</p:selectOneMenu>

Classe Vendedor

@Entity
@Table(name = "vendedor")
public class Vendedor implements Serializable {

	private static final long serialVersionUID = 1L;
	private int id;
	private String nome;
@Id
@GeneratedValue
public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}
@Column(nullable = false, length = 60)
public String getNome() {
	return nome;
}
public void setNome(String nome) {
	this.nome = nome;
}

}

classe producers

@ApplicationScoped
public class EntityManagerProducer {

	private EntityManagerFactory factory;

public EntityManagerProducer() {
	factory = Persistence.createEntityManagerFactory("PedidoPU");
}
@Produces
@RequestScoped
public EntityManager createEntityManager() {
	return factory.createEntityManager();
}
public void closeEntityManager(@Disposes EntityManager manager) {
	manager.close();
}

}
classe bean

@Named
@ViewScoped
public class CadastroClienteBean implements Serializable{

	private static final long serialVersionUID = 1L;

@Inject
private EntityManager manager;

private Cliente cliente = new Cliente();

private List<Vendedor> listaVendedores;

public CadastroClienteBean() {
	cliente = new Cliente();
}

public void salvar() {
	
}

public void init() {
	System.out.println("iniciando...");

	listaVendedores = manager.createQuery("from Vendedor", Vendedor.class).getResultList();
	
	System.out.println(listaVendedores);
}

public Cliente getCliente() {
	return cliente;
}

public List<Vendedor> getListaVendedores() {
	return listaVendedores;
}	

}

Ele faz a pesquisa no banco trazendos os dados, porem nao sei se está trazendo da forma correta. Pois os valores são retornados assim

iniciando…
Hibernate: **
** select

** vendedor0_.id as id1_2_,**
** vendedor0_.nome as nome2_2_ **
** from**
** vendedor vendedor0_**
[com.honda.model.Vendedor@62cc5de5, com.honda.model.Vendedor@4c93e646, com.honda.model.Vendedor@8a4abe5]

O fato é que ele nao popula o componente na pagina.

image

Alguem sabe oque estou fazendo de errado, e poderiam me ajudar por favor?

Boa noite, algumas correções:
No seu f:selectItems do p:selectOneMenu, põem o atributo itemLabel="#{vendedor.nome}", sem esse atributo ele apenas vai ter um valor, e irá aparecer em branco por mais que a query esteja correta.

No seu f:selectItem poem o atributo noSelectionOption=“true”, assim essa opção não poderá ser selecionada.

Para pegar do banco basta:

Query query = manager.createQuery("SELECT v FROM Vendedor v");
return query.getResultList();

Não sei se você chamou o método init em algum lugar, mas se a sua intenção é chama-lo assim que o bean for criado, você tem que anota-lo com @PostConstruct, apenas o nome init não funciona (pode ser qualquer nome na verdade, mas a convenção é init mesmo)

Obrigado Mike, deu certo, apensa tive que atualizar o SQL, colocar o itemLabel no campo da pagina. ja tinha utilizado anteriormente, porem oque solucionou mesmo foi o sql.

Porque preciso utilizar essa nomenclatura ?

SELECT v FROM Vendedor v

Quando se utiliza apenas Hibernate, a query pode ser do jeito que você fez “FROM Vendedor”.
Quando se utiliza JPA, a query tem que ser "SELECT v FROM Vendedor v"
No “FROM Vendedor v” é como se tivessemos criado um objeto “v” da classe Vendedor, ai no “SELECT v” dizemos para pegar todos os dados desse objeto, como não há clausula WHERE, retornará todos os registros do banco, igual o SQL.

Caso você quisesse só o nome do vendedor, bastaria fazer “SELECT v.nome FROM Vendedor v”.

Não sei você ja sabe, mas fiz um exemplo aqui
Ex:

public class Aluno
{
private Integer id;
private String nome;
private Responsavel pai;

//setters e getters
}
public class Responsavel
{
private Integer id;
private String nome;

//setters e getters
}

Caso você queira saber o nome do pai do aluno, é só fazer: “SELECT a.pai.nome FROM Aluno a” (Fiz sem anotações mesmo)