Dificuldades na listagem

Bom dia pessoal. Tou uma dificuldade.

Eu criei uma Enterprise Application no NetBeans com JSF 2.0. Gerei o CRUD automaticamente, para as tabelas Pais e Cidade. Sendo assim, para cada entidade, ele cria EntityBeans, SessionBeans, Controller, páginas Create.xhtml Edit.xhtml, List.xhtml e View.xhtml.

No List.xhtml para a entidade Cidade, ele visualiza o idCidade, nomeCidade e idPais. Mas o que eu quero mesmo é que ele ao invés de visualizar o idPais, visualize nomePais.

No EntityBean da Cidade, foi gerado apenas o campo idCidade, nomeCidade e pais(este é um id_pais). Eis o codigo:

private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id_cidade")
    private Integer idCidade;
    @Basic(optional = false)
    @Column(name = "nome_cidade")
    private String nomeCidade;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "cidade")
    @JoinColumn(name = "id_pais", referencedColumnName = "id_pais")
    @ManyToOne(optional = false)
    private Pais pais;

Será que é preciso neste bean acrescentar alguma anotação?

Isso não tem muito haver com o hibernate e sim com o hibernate.

Verifica em seus xhtml o que está mostrando.
Se você está jogado o objeto sobrescreve o método toString

Olá amigo,

Na realidade o Objeto cidade vc ja tem carregado…

veja no arquivo list.xhtml e procure pela tag que está exibindo o id e cole ela aqui pra gente ver…

mas é no JSF list.xhtml que vc vai mexer sim…

tipo sefor um data table do richfaces…

cole o codigo do datatabel pra gente ver…

Não lembro a sintaxe de cabeça mas posso ajudar…

Fallow

O código do controller para Cidade, em suma, é o seguinte:

.
.
.
@ManagedBean (name="cidadeController")
@SessionScoped
public class CidadeController {

    private Cidade current;
    private DataModel items = null;
    @EJB private sessao.CidadeFacade ejbFacade;
    private PaginationHelper pagination;
    private int selectedItemIndex;

    public CidadeController() {
    }

    public Cidade getSelected() {
        if (current == null) {
            current = new Cidade();
            selectedItemIndex = -1;
        }
        return current;
    }

    private CidadeFacade getFacade() {
        return ejbFacade;
    }

    public DataModel getItems() {
        if (items == null) {
            items = getPagination().createPageDataModel();
        }
        return items;
    }

.
.
.
}

Agora, para a página de listagem da entidade cidade, List.xhtml, o código mais relevante, que está dentro de um datatable, é o seguinte:

<h:dataTable value="#{cidadeController.items}" var="item" border="0" cellpadding="2" cellspacing="0" rowClasses="jsfcrud_odd_row,jsfcrud_even_row" rules="all" style="border:solid 1px">
   <h:column>
      <f:facet name="header">
           <h:outputText value="#{bundle.ListCidadeTitle_pais}"/>
      </f:facet>
      <h:outputText value="#{item.pais}"/>
   </h:column>
</h:dataTable>

Oi Don Quixote,

Pelo que vi aqui seu dataTable está chamando o método toString() do seu Objeto dentro do DataModel retornado pelo controler.

Tente alterar o trecho

      &lt;h:outputText value="#{item.pais}"/&gt;

para

      &lt;h:outputText value="#{item.nomeCidade}"/&gt;

Veja se funciona, pois o trecho #{item.pais} é o nome do atributo pais dentro de cidade , e o certo para o nome da cidade seria #{item.nomeCidade}…

Teste ai e veja se funciona

Fallow

Não é nomeCidade que eu quero apresentar, mas sim nomePais. A minha dúvida consiste em como buscar o nomePais… se será usando anotações no entity bean Cidade, ou de alguma outra forma.

Certo então tente essa linha:

  &lt;h:outputText value="#{item['pais'].nomePais}"/&gt;

Fallow

Funcionou mano. Mas você pode me indicar aonde é que eu posso encontrar material sobre isso? Procurei um pouco pela net e não encontrei. Quem sabe n procurei direito.

Obrigado.

Isso é bem simples…

Pesquise sobre jstl e expression language do jsf…

no data table a sintaxe é igual a um foreach

for (Cliente c:getListaClientes()){

system.out.println(c.getNome());

// se cliente contiver referencia a lista de Compras efetuadas
system.out.println(c.getCompasEfetuadas().size());

}

veja o seu dataTable:

[code]

// var=item significa o nome da variavel, equivale ao c do for anterior, e value="#{cidadeController.items}" equivale ao getListaClientes do for anterior
<h:dataTable value="#{cidadeController.items}" var=“item” border=“0” cellpadding=“2” cellspacing=“0” rowClasses=“jsfcrud_odd_row,jsfcrud_even_row” rules=“all” style=“border:solid 1px”>
<h:column>
<f:facet name=“header”>
<h:outputText value="#{bundle.ListCidadeTitle_pais}"/>
</f:facet>
<h:outputText value="#{item.[‘pais’].nomePais}"/>
</h:column>
//crio uma nova coluna no dataTable
<h:column>
<f:facet name=“header”>
<h:outputText value="#{bundle.ListCidadeTitle_pais}"/>
</f:facet>
// o . serve para dizer que vc quer algo contido no objeto se vc usasse #{item.pais[‘nomePais’]} acho que também funcionaria…
<h:outputText value="#{item.[‘pais’].nomePais}"/>
</h:column>
</h:dataTable>

Mas esse conseito vem das ELs e das JSTLs do JavaEE

Espero ter ajudado

Fallow

Fallow

Isso é bem simples…

Pesquise sobre jstl e expression language do jsf…

no data table a sintaxe é igual a um foreach

for (Cliente c:getListaClientes()){

system.out.println(c.getNome());

// se cliente contiver referencia a lista de Compras efetuadas
system.out.println(c.getCompasEfetuadas().size());

}

veja o seu dataTable:

[code]

// var=item significa o nome da variavel, equivale ao c do for anterior, e value="#{cidadeController.items}" equivale ao getListaClientes do for anterior
<h:dataTable value="#{cidadeController.items}" var=“item” border=“0” cellpadding=“2” cellspacing=“0” rowClasses=“jsfcrud_odd_row,jsfcrud_even_row” rules=“all” style=“border:solid 1px”>
<h:column>
<f:facet name=“header”>
<h:outputText value="#{bundle.ListCidadeTitle_pais}"/>
</f:facet>
<h:outputText value="#{item.[‘pais’].nomePais}"/>
</h:column>
//crio uma nova coluna no dataTable
<h:column>
<f:facet name=“header”>
<h:outputText value="#{bundle.ListCidadeTitle_pais}"/>
</f:facet>
// o . serve para dizer que vc quer algo contido no objeto se vc usasse #{item.pais[‘nomePais’]} acho que também funcionaria…
<h:outputText value="#{item.[‘pais’].nomePais}"/>
</h:column>
</h:dataTable>

[code]
Mas esse conseito vem das ELs e das JSTLs do JavaEE

Espero ter ajudado

Fallow

Isso é bem simples…

Pesquise sobre jstl e expression language do jsf…

no data table a sintaxe é igual a um foreach

for (Cliente c:getListaClientes()){

system.out.println(c.getNome());

// se cliente contiver referencia a lista de Compras efetuadas
system.out.println(c.getCompasEfetuadas().size());

}

veja o seu dataTable:


// var=item significa o nome da variavel, equivale ao c do for anterior, e value="#{cidadeController.items}" equivale ao getListaClientes do for anterior
 &lt;h:dataTable value="#{cidadeController.items}" var="item" border="0" cellpadding="2" cellspacing="0" rowClasses="jsfcrud_odd_row,jsfcrud_even_row" rules="all" style="border:solid 1px"&gt;  
    &lt;h:column&gt;  
       &lt;f:facet name="header"&gt;  
            &lt;h:outputText value="#{bundle.ListCidadeTitle_pais}"/&gt;  
       &lt;/f:facet&gt;  
       &lt;h:outputText value="#{item.['pais'].nomePais}"/&gt;  
    &lt;/h:column&gt;
//crio uma nova coluna no dataTable
    &lt;h:column&gt;  
       &lt;f:facet name="header"&gt;  
            &lt;h:outputText value="#{bundle.ListCidadeTitle_pais}"/&gt;  
       &lt;/f:facet&gt; 
// o . serve para dizer que vc quer algo contido no objeto se vc usasse  #{item.pais['nomePais']} acho que também funcionaria..
       &lt;h:outputText value="#{item.['pais'].nomePais}"/&gt;  
    &lt;/h:column&gt;    
 &lt;/h:dataTable&gt;

Mas esse conseito vem das ELs e das JSTLs do JavaEE

Espero ter ajudado

Fallow

Muito obrigado. Deu para perceber.

De facto, a 2ª forma como você escreveu tbm funciona, até é mais fácil de alterar, pois o código inicial era #{item.pais} e apenas mudou para #{item.pais[‘nomePais’]}.

Um abraço.