Problema com a filtragem do Lazy datatable

Boa tarde.

Estou a manhã inteira tentando fazer o filtro do lazy datatable funcionar corretamente mas não sei o que estou fazendo de errado, já estou quase desistindo!

fiz o datatable com basse nesse: ahttp://uaihebert.com/?p=1089 e tive que adaptar ao sistema aqui onde faço estágio, funciona e tal mas o filtro eu não consigo fazer funcionar corretamente!!

ele as vezes funciona normalmente… ai se eu restarto o servidor ele para de funcionar, restarto novamente ele volta a funcionar… e fica nisso…

se alguém puder me ajudar eu agradeço!

solicitacoes.xhtml


             <p:fieldset id="infoGeral"  toggleable="false" toggleSpeed="500" style="text-align:center">  
					<h:form id="solicitacoes">
					<p:spacer height="10"/>	
						
						
						<p:dataTable id="lazyDataTable" value="#{MbExibeSolicitacoes.solicitacoes}" var="solicitacao" paginator="true" rows="10"
				                selection="#{MbExibeSolicitacoes.solicitacao}" selectionMode="single"
				                
				                paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} 
				                {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
				                
				                currentPageReportTemplate="Página: {currentPage} de {totalPages}"
				                
				                rowsPerPageTemplate="5,10,15" 
				                lazy="true" 
				                paginatorPosition="bottom"
				              	emptyMessage="Não há solicitações registradas."
				              	
				              	
				              	
				                style="font-size:11.5px">
				       
				                <p:column sortBy="#{solicitacao.statusSolicitacao}" filterBy="#{solicitacao.statusSolicitacao}">
				                    <f:facet name="header">Status</f:facet>
				                    <h:outputText value="#{solicitacao.statusSolicitacao}" />
				                </p:column>
				                
				                <p:column sortBy="#{solicitacao.titulo}" filterBy="#{solicitacao.titulo}" >
				                    <f:facet name="header">Titulo</f:facet>
				                    <h:outputText value="#{solicitacao.titulo}" />
				                </p:column>
				                
				                <p:column sortBy="#{solicitacao.processo}" filterBy="#{solicitacao.processo}">
				                    <f:facet name="header">Número do processo</f:facet>
				                    <h:outputText value="#{solicitacao.processo}" />
				                </p:column>
				                
				                <p:column sortBy="#{solicitacao.dataCadastro}" filterBy="#{solicitacao.dataCadastro}">
				                    <f:facet name="header">Data de cadastro</f:facet>
				                    <h:outputText value="#{solicitacao.dataCadastro}" >
				                    	<f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss" locale="pt,BR" timeZone="America/Sao_Paulo" />
				       	            </h:outputText>
				                </p:column>

				                <p:column>
				                    <f:facet name="header">Opções</f:facet>
				                    <p:spacer width="5"/>
				                    <p:commandButton icon="ui-icon-plus" title="Cadastrar pesquisador" />
				                    <p:spacer width="10"/>
				                    <p:commandButton icon="ui-icon-person" title="Visualizar pesquisadores"/>
				                    <p:spacer width="10"/>
				                    <p:commandButton icon="ui-icon-search" title="Visualizar solicitação"/>
				                    <p:spacer width="5"/>
				                </p:column>
            			</p:dataTable>
            			</h:form>
        		    	
                    </p:fieldset>	

ManagedBeanExibeSolicitacoes.java

@ManagedBean(name="MbExibeSolicitacoes")
@ViewScoped
public class ManagedBeanExibeSolicitacoes {
	
	
	private LazyDataModel<Solicitacao>solicitacoes = null;
	
	private Solicitacao solicitacao;
	
	private Usuario usuario;
	
	public ManagedBeanExibeSolicitacoes(){
		
	}
	    

	public LazyDataModel<Solicitacao> getSolicitacoes() {
        
		if (this.solicitacoes == null) {
        	
        	this.solicitacoes = FabricaAplicacao.servicoExibeSolicitacoes();
        
        }
 
        return this.solicitacoes;
    }
	
	
	public Solicitacao getSolicitacao() {
       
		if(this.solicitacao == null){
			
            this.solicitacao = new Solicitacao();
        }
 
        return solicitacao;
    }
	
	 public void setSolicitacao(Solicitacao solicitacao) {
		 
	        this.solicitacao = solicitacao;
	 }
	 
	 
	 
}

ServicoExibeSolicitacoes.java


public class ServicoExibeSolicitacoes extends LazyDataModel<Solicitacao>{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private RepositorioSolicitacao repositorioSolicitacao;
	
	private List<Solicitacao> solicitacoes;
	
	private EntityManager entityManager;
	
	public ServicoExibeSolicitacoes(RepositorioSolicitacao repositorioSolicitacao, EntityManager entityManager) {
		this.repositorioSolicitacao = repositorioSolicitacao;
		this.entityManager = entityManager;
		
	}
	
	  @Override
	  public Object getRowKey(Solicitacao solicitacao) {
	      return solicitacao.getId();
	  }
	
	  @Override
	  public Solicitacao getRowData(String idSolicitacao) {
	     
	  	Integer id = Integer.valueOf(idSolicitacao);
	
	      for (Solicitacao solicitacao : this.solicitacoes) {
	          
	      	if(id.equals(solicitacao.getId())){
	              return solicitacao;
	          }
	      }
	
	      return null;
	  }
	
   @Override
	public List<Solicitacao> load(int inicio, int maximo, String sortField, SortOrder sortOrder, Map<String, String> filters) {
           	
	   	EntityTransaction transacao = this.entityManager.getTransaction();
  		
	   	transacao.begin();
        
	  	
	 	
	   	String nomeCampo = "";
	   	
	   	String valorCampo = "";
	   	
	   	String filtro = "";
	   	

	   	for(Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {
            
	 		nomeCampo = it.next(); //Nome do atributo
        
            valorCampo = filters.get(nomeCampo); //valor do atributo
            
            if((nomeCampo != null && valorCampo != null)){
            	filtro = "where o."+nomeCampo+" like'%"+valorCampo+"%'"; 
            }else{
            	filtro = "";
            }
        }
        
       		try{
       			
       			
       			this.solicitacoes = this.repositorioSolicitacao.buscarRegistros(inicio, maximo, filtro);
       			
       			transacao.commit();
       			
       		}catch (Exception e) {
       			
       			transacao.rollback();
       			
       			e.printStackTrace();
       			
       		}

       		
       		if(getRowCount() <= 0){
       			
       			
       			setRowCount(this.repositorioSolicitacao.contar(filtro));
       		}

       		
       		setPageSize(maximo); //Define o máximo de páginas

       		
       		return this.solicitacoes;
		
		}
}

repositorio.java

public List<T> buscarRegistros(int inicio, int maximo, String filtro) {
		
    	String jpql  = "select o from " + classeDominio.getSimpleName() +" o ";
    	
    	if(filtro != null){
    		jpql += filtro;
    	}
        	
        Query query = entityManager.createQuery(jpql);
        
        query.setFirstResult(inicio);
        query.setMaxResults(maximo);
 
        return query.getResultList();
    }
	
	/**
	 * 
	 * @return Obtém a quantidade de registros 
	 */
	public int contar(String filtro) {
		
		String jpql = "select COUNT(o) from " + classeDominio.getSimpleName() +" o ";
		
		if(filtro != null){
			jpql += filtro;
		}
		
        Query query = entityManager.createQuery(jpql);
 
        Number resultado = (Number) query.getSingleResult();
 
        return resultado.intValue();
    }