[RESOLVIDO] - Problemas com o metodo de BUSCA

Bom dia,
estou desenvolvendo um sistema de busca, onde eu tenho 3 opçoes, buscar por id, nome, processo. A busca por id, tudo tranquilo, já a busca por nome e por processo que esta dando esse erro:

22/07/2011 09:46:34 javax.faces.event.MethodExpressionActionListener processAction
GRAVE: 'java.sql.SQLException' recebido ao invocar escuta de ação '#{manifestacaoBean.pesqBasica}' para o componente 'j_idt27'
22/07/2011 09:46:34 javax.faces.event.MethodExpressionActionListener processAction
GRAVE: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
	at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3717)
	at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3701)
	at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:4552)
	at com.mysql.jdbc.PreparedStatement.setObject(PreparedStatement.java:3956)
	at Dao.DAO.executeQuery(DAO.java:44)
	at Dao.PesquisaDAO.getFindByNOME(PesquisaDAO.java:31)
	......
22/07/2011 09:46:34 com.sun.faces.context.ExceptionHandlerImpl log
GRAVE: JSF1073: javax.faces.event.AbortProcessingException obtido durante o processamento de INVOKE_APPLICATION 5: UIComponent-ClientId=formBusca:j_idt27, Message=java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
22/07/2011 09:46:34 com.sun.faces.context.ExceptionHandlerImpl log
GRAVE: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
javax.faces.event.AbortProcessingException: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
	........
Caused by: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
	at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3717)
	at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3701)
	at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:4552)
	at com.mysql.jdbc.PreparedStatement.setObject(PreparedStatement.java:3956)
	at Dao.DAO.executeQuery(DAO.java:44)
	at Dao.PesquisaDAO.getFindByNOME(PesquisaDAO.java:31)
	at Bean.ManifestacaoBean.pesqBasica(ManifestacaoBean.java:194)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:153)
	... 28 more

codigo do meu Bean:

    public List<Manifestacao> pesqBasica() throws ClassNotFoundException, SQLException {
        if (!"".equals(id)) {
            manifests = pdao.getFindByID(id);
        }

        if (!"".equals(nome)) {
            manifests = pdao.getFindByNOME(nome);
        }

        /*
        if (!"".equals(processo)) {
        pesqBasica = pdao.getFindByPROCESSO(processo);
        }
         */
        return manifests;
    }

Codigo do Dao:


    //METODO PARA DE BUSCA SIMPLES - ID
    public List<Manifestacao> getFindByID(String s) throws SQLException {
        String SQL = "SELECT * FROM Ouvidoria.Manifestacao WHERE id = ?";
        ResultSet rs = executeQuery(SQL, s);
        List<Manifestacao> toReturn = new LinkedList<Manifestacao>();
        while (rs.next()) {
            toReturn.add(populate(rs));
        }
        rs.close();
        return toReturn;
    }

    
    //METODO PARA DE BUSCA SIMPLES - NOME
    public List<Manifestacao> getFindByNOME(String s) throws SQLException {
        String SQL = "SELECT * FROM Ouvidoria.Manifestacao WHERE nome LIKE LOWER('%?%')";
        ResultSet rs = executeQuery(SQL, s);
        List<Manifestacao> toReturn = new LinkedList<Manifestacao>();
        while (rs.next()) {
            toReturn.add(populate(rs));
        }
        rs.close();
        return toReturn;
    }
    
    //METODO PARA DE BUSCA SIMPLES - PROCESSO
    public List<Manifestacao> getFindByPROCESSO(String s) throws SQLException {
        String SQL = "SELECT * FROM Ouvidoria.Manifestacao WHERE processo LIKE LOWER('%?%')";
        ResultSet rs = executeQuery(SQL, s);
        List<Manifestacao> toReturn = new LinkedList<Manifestacao>();
        while (rs.next()) {
            toReturn.add(populate(rs));
        }
        rs.close();
        return toReturn;
    }

Codigo HTML do form da busca.

<h:outputLabel value="Código:" /> <p:inputText label="id" value="#{manifestacaoBean.id}" maxlength="14" size="18" />
<h:outputLabel value="Nome  :" /> <p:inputText label="nome" value="#{manifestacaoBean.nome}" maxlength="14" size="30" />
<h:outputLabel value="Número:" /> <p:inputText label="processo" value="#{manifestacaoBean.processo}" maxlength="14" size="30" />

<p:commandButton value="Buscar" actionListener="#{manifestacaoBean.pesqBasica}" update="formResult, formBusca" ajax="false" />

Alguem poderia me ajudar a solucionar este erro? Não estou conseguindo enteder esta linha que da o erro: GRAVE: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0)., sendo que a função ela esta parametrizada sim.

Alguem pode me ajudar ???

Acredito que o problema seja porque tu tá trabalhando com o caractere coringa % junto com o ?.

Cola aqui o método onde você define o statement.setString(), pra eu ver como você faz.

Abs,

[quote=riqueluz]Acredito que o problema seja porque tu tá trabalhando com o caractere coringa % junto com o ?.

Cola aqui o método onde você define o statement.setString(), pra eu ver como você faz.

Abs,

[/quote]

Engraçado, vc ter dito isso, nao atentei para isso. Mas o metodo que faz o statement … o metodo que eu uso é esse …

    public ResultSet executeQuery(String query, Object... params) throws SQLException {
        PreparedStatement ps = getStatement(query);
        for (int i = 0; i &lt; params.length; i++) {
            ps.setObject(i + 1, params[i]);
        }
        return ps.executeQuery();
    }

Hum, entendi. Bem legal sua idéia, mas nesse caso ai que usa o coringa junto com o ? quando você adiciona a variável a sua sql gerada vai ficar algo do tipo:

SELECT * FROM Ouvidoria.Manifestacao WHERE nome LIKE LOWER('% '10' %')

Já que você seta uma string. Por isso dá o erro.

To tentando pensar numa alternativa aqui, mas esse é o seu problema.

Abs,

String quote(String str){
  return "%" + str + "%";
}

[quote=riqueluz]Hum, entendi. Bem legal sua idéia, mas nesse caso ai que usa o coringa junto com o ? quando você adiciona a variável a sua sql gerada vai ficar algo do tipo:

SELECT * FROM Ouvidoria.Manifestacao WHERE nome LIKE LOWER('% '10' %')

Já que você seta uma string. Por isso dá o erro.

To tentando pensar numa alternativa aqui, mas esse é o seu problema.

Abs,[/quote]

Poise, quando vc falow putz, vi uma luz no fim da rua … hahahahaha. Ae eu me lembrei, que um carinha ae tinha feito uma mesma coisa com um tal de StringBuilder … tow tentando lembrar a logica ae …

mais valeu msmo !!! quando resolver eu posto o codigo completo ae pra moçada !!!

valew ae irmão !!!

    public List<Manifestacao> getFindByNOME(String s) throws SQLException {
        s += quote(s);
        String SQL = "SELECT * FROM Ouvidoria.Manifestacao WHERE nome LIKE '?'";
        ResultSet rs = executeQuery(SQL, s);
        List<Manifestacao> toReturn = new LinkedList<Manifestacao>();
        while (rs.next()) {
            toReturn.add(populate(rs));
        }
        rs.close();
        return toReturn;
    }

Poxa, troquei e tall mas continua com problema o metodo. Não tenho ideia de como resolver isso !!!

Alguem tem alguma ideia de como resolver ???

Não sei o que você tá colocando no seu quote(s), mas acredito que não precisa colocar as aspas simples na ?

Seria mais ou menos isso…

SELECT * FROM Ouvidoria.Manifestacao WHERE nome LIKE LOWER( ?) 

s = "%"+s+"%"; 
 ResultSet rs = executeQuery(SQL, s);  

mas parece que você fez uma salada de JPA com JDBC

a menos que Manifestação extenda String…

[quote=Puka]Seria mais ou menos isso…

SELECT * FROM Ouvidoria.Manifestacao WHERE nome LIKE LOWER( ?) 

s = "%"+s+"%"; 
 ResultSet rs = executeQuery(SQL, s);  

mas parece que você fez uma salada de JPA com JDBC

a menos que Manifestação extenda String…[/quote]

Ola puka, sim a Manifestação ela extende sim a String. Tentei deixar tudo mais generico possivel pra poder re-utilizar os codigos sem ter que reescreve-los.
ainda nao consegui fazer nao … vou fazer novos testes e entao eu postarei novamente.

mas fica aki o meu sincero agradecimento.

vamo lah que a noite ainda é uma criança !!!

abs!

Pessoal, alguem tem mais alguma ideia?

Pessoal foi resolvido!

    public List<Manifestacao> getFindByNOME(String s) throws SQLException {
        s = "%"+s+"%";
        String SQL = "SELECT * FROM Ouvidoria.Manifestacao WHERE NOME LIKE ? ORDER BY NOME";
        ResultSet rs = executeQuery(SQL, s);
        List<Manifestacao> toReturn = new LinkedList<Manifestacao>();
        while (rs.next()) {
            toReturn.add(populate(rs));
        }
        rs.close();
        return toReturn;
    }

Coisa besta, mas obrigado a todos !!!

Sei que é um tópico de 2009, mas só queria agradecer.