jpa jpql filter without using the primeface filter (with proper method)

Asked

Viewed 1,390 times

3

Changed to likely solution however is not working yet, it seems to me that the line is not updated with ajax.

<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 list get and my method to bring the filter, now the two reference 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 is now as follows, it updates the filter click on my EL but it can not find when I press the button to edit the same, in case it sees as the old one, IE always brings the first of the list.

  • Why don’t you use the filter of Primefaces itself? He already does the job for you. Take a look here.

  • Follow the example of Datatable Lazy from Primefaces that has no error: Datatable - Lazy

  • i would not like to use the primeface filter.

  • I would not like to use the primefaces filter because I don’t want my application to be attached to this frame.

2 answers

2


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

What happens is that whenever I filtered the content it always went to the same page so the request(Request) always responded to the same page and jsf can’t understand that, well that from what I read on the subject is matter of scope I have to put all possible credits to the holder of this blog, http://blog.gilliard.eti.br, So let’s see what’s changed.

1: set a convert to treat 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 compote that does the Answer to the EL you will edit (only this button has been changed nothing else), note that a page redirect has been added and in order for jsf to accept this data alive with @Viewsoped we need to pass it by the url so it is made 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: On 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, just receives the parameters that in the case is the obj itself, passed in the url and jsf takes care of the rest(but you must always define the entries)

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

It took me a long time to understand what was going on, it proves that to program you need to study hard, and not by sticking your face in the code.

1

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

The <p:commandButton> would look like this with the update:

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

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

  • Opa cara blz, next I did as you said but still he is not bringing the desired, he always sees the table lines as if they had without the filter. she is at https://github.com/AndreMart/comunicaVisual/blob/master/WebContent/admin/pgtbproducto.xhtml this is the product EL also has the controller https://github.com/AndreMart/comunicaVisualblob/master/src/drem/managebean/productMb/MbProdutojava. gives a strength... o0

  • edited the post above to see how it looked.

  • Strange not to work as it is. I have a page that makes the same scheme as yours, but I do the update for the ID of <p:dataTable>. Try to put the update="tableProduto.

  • I also did this test, I wonder what scope you are using, if I put @Sessionscope even works, but the object is in the session and then it becomes a mess and it’s in the requestScop that is the default. You would have an example of a filter that you made just for me to compare, because I also don’t see the error, maybe on github.com

  • Try putting @Viewscope, in my case I used it.

  • look at the solution I got, what do you think?

Show 1 more comment

Browser other questions tagged

You are not signed in. Login or sign up in order to post.