jpql filter without using the filter of primefaces (with its own method)

3

Changed to probable solution but still not working, it seems that the line with ajax is not updated.

<h:body>
<h:form id="formTableProd">
    <ui:composition template="/templates/master.xhtml">
        <ui:define name="conteudo">

            <h2>
                <p:outputLabel value=" Filtro e ações para produtos" />
            </h2>
            <h:panelGrid columns="4">
                <p:outputLabel value="Filtro:" />
                <p:inputText value="#{mbProduto.produto.nomeProduto}" size="50"
                    maxlength="150" onkeyup="this.value = this.value.toUpperCase()">
                </p:inputText>
                <p:commandButton icon="ui-icon-search" title="Filtrar"
                    action="#{mbProduto.filtroPersonalizado}" update="@form">
                </p:commandButton>
            </h:panelGrid>

            <p:dataTable id="tableProduto" value="#{mbProduto.resultado}"
                var="produtos" paginator="true" rows="10"
                paginatorTemplate="{CurrentPageReport}
                {FirstPageLink}
                {PreviousPageLink} {PageLinks}
                {NextPageLink} {LastPageLink}
                {RowsPerPageDropdown}"
                rowsPerPageTemplate="5,10,15" style="width: 98%" lazy="true"
                rowKey="#{produtos.idProduto}" selectionMode="single">
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Cod.:" />
                    </f:facet>
                    <p:outputLabel value="#{produtos.idProduto}" />
                </p:column>

                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Nome:" />
                    </f:facet>
                    <p:outputLabel value="#{produtos.nomeProduto}" />
                </p:column>

                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Esf.:" />
                    </f:facet>
                    <p:outputLabel value="#{produtos.especificacaoProduto}" />
                </p:column>

                <p:column>
                    <f:facet name="header">
                        <h:outputText value="X.:" />
                    </f:facet>
                    <p:outputLabel value="#{produtos.medidaX}" />
                </p:column>

                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Y.:" />
                    </f:facet>
                    <p:outputLabel value="#{produtos.medidaY}" />
                </p:column>

                <p:column>
                    <f:facet name="header">
                        <h:outputText value="R$ Venda" />
                    </f:facet>
                    <p:outputLabel value="#{produtos.precoDeMetroVenda}" />
                </p:column>

                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Ações" />
                    </f:facet>
                    <p:commandButton icon="ui-icon-close" title="Excluir um produto"
                        action="#{mbProduto.excluir}" id="produtos" ajax="false"
                        onclick="if(!confirm('Deseja excluir #{produtos.nomeProduto}  ?')) return false">
                        <f:setPropertyActionListener value="#{produtos}"
                            target="#{mbProduto.produto}" />
                    </p:commandButton>

                    <p:commandButton icon="ui-icon-arrowreturnthick-1-s"
                        title="Alterar um produto"
                        action="#{mbProduto.direcionarAlteracao}" update="tableProduto"
                        process="@this" ajax="true">
                        <f:ajax execute="@form" update="produtos.idProduto"
                            render=":tableProduto"></f:ajax>
                        <f:setPropertyActionListener value="#{produtos}"
                            target="#{mbProduto.produto}" />
                    </p:commandButton>



                    <p:commandButton icon="ui-icon-circle-plus"
                        title="Adicionar um produto" action="#{mbProduto.novo}" />

                </p:column>

            </p:dataTable>

        </ui:define>
    </ui:composition>
</h:form>

My get from the list and my method to bring the filter, now both refer to the same list.

public List<Produto> getResultado(){
     if(resultado == null){
            resultado = new ArrayList<Produto>();
            EntityManager em = JPAUtil.getEntityManager();
            Query q = em.createQuery("select a from Produto a", Produto.class);
            this.resultado = q.getResultList();
            em.close();    
        }
        return resultado;

}

public String filtroPersonalizado() {
    EntityManager em = JPAUtil.getEntityManager();
    String consulta = "select p from Produto p where p.nomeProduto = :nome";
    TypedQuery<Produto> query = em.createQuery(consulta, Produto.class);
    query.setParameter("nome", produto.getNomeProduto());
    this.resultado = query.getResultList();
    em.close();
    return "";
}

The situation now is as follows, it updates the filter loads on my EL but it can not find when I press the button to edit it, in case it looks like it was the old one, ie it always brings the first one from the list .

    
asked by anonymous 24.07.2014 / 03:00

2 answers

2

Solved, the solution requires a little study rs but that's pretty cool and I think it's worth putting here, so come on.

What happens is the following whenever I filter the content it always went to the same page so the request always responded to the same page and jsf can not understand it, well that's what I read about it it's a matter of scope I have to put all possible credits to the holder of this blog, link , so let's see what has changed.

1: set a convert to handle the return and convert to whatever I want.

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

import br.com.drem.entity.Produto;
import br.com.drem.util.JPAUtil;

@FacesConverter(forClass=Produto.class)
public class ProdutoConverter implements Converter {

@Override
public Object getAsObject(FacesContext context, UIComponent component, String string) {
    System.out.println("ProdutoConverter.getAsObject(): " + string);
    if(string == null || string.isEmpty()){
        return null;
    }
    return JPAUtil.getEntityManager().find(Produto.class, Long.valueOf(string));
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object object) {
    Produto produto = (Produto) object;
    System.out.println("ProdutoConverter.getAsString(): " + produto);
    if(produto == null || produto.getIdProduto() == null){
        return null;
    }
    return String.valueOf(produto.getIdProduto());
}

}

2: Change my controller to ViewScoped

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.TypedQuery;

import br.com.drem.dao.ProdutoDao;
import br.com.drem.entity.Produto;
import br.com.drem.managebean.produtoMb.rn.RegraNegocioProduto;
import br.com.drem.util.JPAUtil;

/**
 * @author AndreMart
 * @contacts: [email protected];[email protected]
 * @tel: 63 8412 1921
 * @site: drem.com.br
 */
@ManagedBean(name = "mbProduto") @ViewScoped
public class MbProduto implements Serializable {
private static final long serialVersionUID = 1L;
private Produto produto;
private ProdutoDao produtoDao;
private List<Produto> resultado;

public MbProduto() {
    this.produtoDao = new ProdutoDao();
    this.produto = new Produto();
}

public void setResultado(List<Produto> resultado) {
    this.resultado = resultado;
}

public Produto getProduto() {
    return produto;
}

public void setProduto(Produto produto) {
    this.produto = produto;
}

public ProdutoDao getProdutoDao() {
    return produtoDao;
}

public void setProdutoDao(ProdutoDao produtoDao) {
    this.produtoDao = produtoDao;
}

public String novo() {
    RegraNegocioProduto.limpProduto();
    return "pgproduto";
}

public String salvar() {
    RegraNegocioProduto.salvar(produto);
    //atribuirEstadoInicial();
    return "pgtbproduto" + "?faces-redirect=true";
}

public String excluir() {
    RegraNegocioProduto.excluir(produto);
    return "pgtbproduto" + "?faces-redirect=true";
}


public List<Produto> getResultado(){
     if(resultado == null){
            resultado = new ArrayList<Produto>();
            EntityManager em = JPAUtil.getEntityManager();
            Query q = em.createQuery("select a from Produto a", Produto.class);
            this.resultado = q.getResultList();
            em.close();    
        }
        return resultado;

}

public String filtroPersonalizado() {
    EntityManager em = JPAUtil.getEntityManager();
    String consulta = "select p from Produto p where p.nomeProduto = :nome";
    TypedQuery<Produto> query = em.createQuery(consulta, Produto.class);
    query.setParameter("nome", produto.getNomeProduto());
    this.resultado = query.getResultList();
    em.close();
    return "";
}
}

3: Change the compiler that does the response to the EL that will edit (only this button was changed no more), note that a page redirect was added and for jsf to accept this data to be alive with @ViewSoped we need to pass the same by the url for this is done includeViewParams = true "

<h:commandButton value="edit"
                        title="Alterar um produto"
                        action="pgproduto?faces-redirect=true&amp;includeViewParams=true">
                        <f:setPropertyActionListener value="#{produtos}" target="#{mbProduto.produto}" />
                    </h:commandButton>

4: In the page that will receive the data put a viewParam, basically this component would be like an input the difference would be that the user does not type anything, only receives the parameters that in the case is the obj itself, passed in the url and the jsf takes care of the rest (but you should always define the entries)

    <f:metadata>
        <f:viewParam name="id" value="#{mbProduto.produto}" />
    </f:metadata>

It took me a long time to figure out what was going on, this proves that to program you need to study hard, and not go straight into the code.

    
15.10.2014 / 04:52
1

This can be done by changing the search method so that it populates the #{mBProduto.produto} list with the filtered values in your method, and then updating the data (the same list as the <p:dataTable> ) of the form with Ajax <p:commandButton> .

The <p:commandButton> would look like update :

<p:commandButton icon="ui-icon-search" title="Filtrar"
                action="#{mbProduto.filtroPersonalizado}"
                update="@form">
</p:commandButton>

In this way, the data on the page will be the same as the filtroPersonalizado() method whenever the search is triggered by the button.

    
10.10.2014 / 19:41