Dúvida em como usar EntityHome e EntityQuery no Seam

1 resposta
rafael.espiritosanto

Ola!

Eu fiz quase todos os casos de uso utilizando Session Beans. No entanto, duas funcionalidades eu fiz utilizando o EntityHome e o EntityList (eram coisas simples, no estilo CRUD ).
Só que eu adicionei um botão de busca que permita que a listagem dos resultados seja um pouco mais seletiva.

O método que faz a busca está funcionando. Só que eu não sei como exibir os resultados na página de listagem.
Nesta página, o valor da tabela que irá exibir os resultados faz referência a um variável implícita (no caso da noticia é NoticiaList.resultList) com a qual eu não sei trabalhar.

Quando eu entro na página de listar noticias, o construtor da classe NoticiaList é executado e a variavel resultList é populada.
Se eu faço uma busca mais seletiva (através do botão buscar), gostaria que os resultados fossem exibidos na mesma página que exibe a listagem completa (página listarNoticias.xhtml).
A dúvida é que eu não sei como popular a variável resultList da classe NoticiaList. Atualmente o hibernate retorna o resultado correto (eu testei utilizando log) mas o que é exibido é a listagem de todas as noticías cadastradas no banco (a listagem que é exibida quando eu entro na página de listagem pela primeira vez)

Este é o método que fica na classe Home e é responsável por realizar a busca pelas notícias conforme o gosto do usuário
public String buscarNoticia(BuscarNoticiaForm form) {
    	SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
    	
    	String sql = "select n from Noticia n where 1 = 1 and ";
    	if (form.getTitulo().trim().length() > 0) {
    		String titulo = form.getTitulo();
    		sql += "n.titulo = '" + titulo + "' and ";
    	}
    	if (form.getLink().trim().length() > 0) {
    		String link = form.getLink();
    		sql += "n.link = '" + link + "' and "; 
    	}
    	if (form.getConteudoResumo().trim().length() > 0) {
    		String resumo = form.getConteudoResumo();
    		sql += "n.resumo like '%" + resumo + "%') and ";
    	}
    	if (form.getDataInicio() != null && form.getDataTermino() != null) {
    		String dataInicio = format.format(form.getDataInicio());
    		String dataTermino = format.format(form.getDataTermino());
    		sql += "n.data > '" + dataInicio + "' and n.data < '" + dataTermino + "' and ";
    	} else if (form.getDataInicio() != null) {
    		String dataInicio = format.format(form.getDataInicio());
    		sql += "n.data > '" + dataInicio + "' and ";
    	} else if (form.getDataTermino() != null) {
    		String dataTermino = format.format(form.getDataTermino());
    		sql += "n.data < '"+ dataTermino + "' and ";
    	}
    	sql = sql.substring(0, sql.length() - 4);
    	sql += " order by n.data desc";
    	//log.info(sql);
    	List noticias = getEntityManager().createQuery(sql).getResultList();
    	//noticiaList.getEntityManager().createQuery(sql).getResultList();
    	//Query query = entityManager.createQuery(sql);
    	//List<Noticia> list = query.getResultList();
    	
    	log.info("Resultados encontrados: " + noticias.size());
    	return "/noticia/listarNoticias.xhtml";
    }
A página responsável por exibir os resultados da busca (esta página faz referência a variável resultList da classe EntityQuery)
<rich:dataTable id="noticias" var="_noticia"
                      value="#{noticiaList.resultList}"
                   rendered="#{not empty noticiaList.resultList}" rows="10">
                <h:column>
                    <f:facet name="header">#{messages['noticia.noticia.label']}</f:facet>
                    <s:link id="noticia"
                         value="#{_noticia.titulo}"
                   		 propagation="none"
                         view="/noticia/visualizarNoticia.xhtml">
                        <f:param name="noticiaId"
                                value="#{_noticia.id}"/>
                    </s:link>
                </h:column>
                <h:column>
                	<f:facet name="header">#{messages['noticia.data.label']}</f:facet>
                	<h:outputText value="#{_noticia.data}">
                		<f:convertDateTime pattern="dd/MM/yyyy"/>
                	</h:outputText>
                </h:column>
                <h:column rendered="#{noticiaHome.ehAdministrador}">
                    <s:link id="editarNoticia"
                         value="#{messages['comando.editar']}"
                   		 propagation="none"
                         view="/noticia/noticia.xhtml">
                        <f:param name="noticiaId"
                                value="#{_noticia.id}"/>
                    </s:link>
                </h:column>
            </rich:dataTable>
E por fim o conteúdo da classe NoticiaList.
package br.ufrj.cos.portalfees.session.noticia;

import org.jboss.seam.annotations.Name;
import org.jboss.seam.framework.EntityQuery;
import br.ufrj.cos.portalfees.entity.Noticia;

@Name("noticiaList")
public class NoticiaList extends EntityQuery<Noticia>
{
    public NoticiaList()
    {
        setEjbql("select noticia from Noticia noticia order by noticia.data desc");
    }
}

Como não estou habituado a utilizar esta arquitetura, não tenho certeza se o que estou fazendo está correto.
Agradeço pela ajuda!

Abraço!

1 Resposta

rafael.espiritosanto

A pergunta mais correta seria: é possível reaproveitar a página de listagem de resultados utilizando sempre a variável noticiaList.resultList, indenpendente da forma com que a página foi chamada?
(entrando na página pela primeira vez e exibindo todos os resultados ou acionando o botão de busca para então voltar para a página de listagem com os resultados desejados)

Criado 31 de março de 2009
Ultima resposta 31 de mar. de 2009
Respostas 1
Participantes 1