[Resolvido]Ajuda com pesquisa JSF

Pessoal,estou tentando fazer uma consulta simples na minha pagina, tenho um inputtext onde digito a palavra que desejo e clico em um botão para realizar a pesquisa, o problema e que a consulta esta retornando null mas o registro que estou pesquisando existe no banco, meu código esta da seguinte forma:

Dao:

public Categorias pesquisar(String nome){ Categorias categoria = new Categorias(); Conexao conn = new Conexao(); try{ Statement stmt = (Statement) conn.getConn().createStatement(); ResultSet rs = stmt.executeQuery("select * from categorias where nome like '%"+nome+"%' "); rs.next(); categoria.setCodigo(rs.getLong("codigo")); categoria.setNome(rs.getString("nome")); } catch(Exception e){ e.printStackTrace(); } return categoria; }

Bean:

public void pesquisar(){ CategoriasDAO categoriadao=new CategoriasDAO(); categoria=categoriadao.pesquisar(pesquisa_categoria.getPesquisar_nome()); }

Obs: o “categoria” e “pesquisa_categoria” são do mesmo tipo, eu quero que o “categoria” receba o valor da consulta do “pesquisa_categoria”

minha pagina ta assim:

            <p:inputText value="#{categoriasBean.pesquisa_categoria.pesquisar_nome}"/><p:commandButton value="Pesquisar" actionListener="#{categoriasBean.pesquisar}"/>
  1. Utilize camelCase e não _ nos nomes. O padrão java é utilizado assim e existem vários componentes que esperam esse padrão nas classes.
  2. coloque ajax=false no seu botão.
  3. Troque de actionListener para action.

O sql pode estar no modo case sensitive também, experimente remover a clausula where, e de um select *, veja se retorna alguma coisa

Alguem tem algum exemplo que possa postar?

Ae, eu utilizo hibernate com a Criteria API e metamodels, vou ver se acho um exemplo com dao básico via jdbc e posto depois, segue abaixo no modelo do hibernate:

	public List<Produto> pesquisarProduto(Map<String, Object> args) {

		try {
			CriteriaBuilder cb = em.getCriteriaBuilder();
			CriteriaQuery<Produto> cq = cb.createQuery(Produto.class);
			Root<Produto> produto = cq.from(Produto.class);

			Predicate restrictions = cb.conjunction();

			restrictions = cb.and(restrictions, cb.equal(produto.get(Produto_.excluido), false));

			for (Map.Entry<String, Object> entry : args.entrySet()) {
				String att = entry.getKey();
				Object value = entry.getValue();

				if (att == "produto" && !value.equals(null)) {

					restrictions = cb.and(restrictions, cb.like(cb.lower(produto.get(Produto_.produto)), 
								                                   "%" + ((String) value).toLowerCase() + "%"));
				}
				if (att == "tipo" && !value.equals(null)) {
					restrictions = cb.and(restrictions, cb.equal(produto.get(Produto_.tipo), (TipoProduto) value));
				}

			}
			cq.where(restrictions);
			cq.orderBy(cb.asc(produto.get(Produto_.produto)));

			TypedQuery<Produto> query = em.createQuery(cq);
			query.setHint("org.hibernate.cacheable", true);
			produtos = query.getResultList();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return produtos;
	}

Tem esse outro exemplo que fiz em 1 curso utilizando apenas jdbc, a ideia é pegar a quantidade de posts passados pelo parametro qtde de um determinado usuario em um blog
veja se ajuda:

	public List<Post> getLastPosts(int qtde) throws DAOException {
		List<Post> retorno = new ArrayList<Post>();

		Connection con = null;
		PreparedStatement stm = null;
		ResultSet rs = null;
		try {
			con = ConnectionGetter.getConnection();

			StringBuilder query = new StringBuilder();
			
			query.append("SELECT post.id postid, post.conteudo conteudo, post.titulo titulo, post.data postdata, ");
			query.append("usu.nome nomeusuario, usu.id idusuario ");
			query.append("FROM Post post ");
			query.append("JOIN Usuario usu ON (post.idusuario = usu.id) ");
			query.append("ORDER BY postdata DESC ");
			query.append("LIMIT ?");

			stm = con.prepareStatement(query.toString());
			stm.setInt(1, qtde);

			rs = stm.executeQuery();
			while (rs.next()) {
				Post post = new Post();

				post.setId(rs.getInt("postid"));
				post.setConteudo(rs.getString("conteudo"));
				post.setTitulo(rs.getString("titulo"));
				post.setData(rs.getDate("postdata"));

				Usuario user = new Usuario();
				user.setId(rs.getInt("idusuario"));
				user.setNome(rs.getString("nomeusuario"));

				post.setUsuario(user);
				retorno.add(post);
			}

		} catch (Exception ex) {
			throw new DAOException(ex);
		} finally {
			this.closeResources(rs, stm, con);
		}
		
		return retorno;
	}

Resolvi :slight_smile: Era só probleminha na hora de executar o SQL mesmo, vlw

Luciano_Lopes tem como me mostrar como ficou o seu pra dar certo ?

veja meu Dao

[code]public Usuario buscar(String nome) throws Exception {
Usuario usuario = new Usuario();
PreparedStatement ps = null;
ResultSet rs = null;

	try {

		String sql = ("select * from tab_usuario where usuario_usuario = '%" + nome + "%'");
		ps = this.conn.prepareStatement(sql);
		rs = ps.executeQuery();

		rs.next();
		usuario.setNome(rs.getString("usuario_usuario"));
		
		
	}

	catch (SQLException sqle) {
		throw sqle;
	} finally {
		ConnectionFactory.closeConnection(this.conn, ps, rs);
	}
	return usuario;
}[/code]

ou caso alguem possa me ajudar.

erro: javax.servlet.ServletException: org.postgresql.util.PSQLException: ResultSet não está posicionado corretamente, talvez você precise chamar next.
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)

No teu caso ele realmente não encontrou o registro, tente usar like na pesquisa e rs.first() no lugar do rs.next()

opa, o nome procurado existe no banco, então vou tentar fazer essa mudança pra ver no que da.
valeu

[b]Falta pouco :slight_smile:

O meu método buscar() que fica no DAO funcionou, ele povoa uma lista com todos os dados do usuário que passei através de uma string
vejam:[/b]

[code]public List buscar(String usuario) throws Exception {
List list = new ArrayList();

	PreparedStatement ps = null;
	ResultSet rs = null;

	try {

		String sql = ("select * from tab_usuario where usuario_usuario like '"
				+ usuario + "'");
		ps = this.conn.prepareStatement(sql);
		rs = ps.executeQuery();

		rs.next();

		Integer id = rs.getInt("id_usuario");
		String tempNome = rs.getString("usuario_usuario");
		String senha = rs.getString("senha_usuario");

		list.add(new Usuario(id, tempNome, senha));

	}

	catch (SQLException sqle) {
		throw sqle;
	} finally {
		ConnectionFactory.closeConnection(this.conn, ps, rs);
	}
	return list;
}[/code]


A questão agora é: no meu bean eu terei que capturar essa lista usando DataModel ??
estou fazendo assim no bean mas esta capturando apenas o getNome
:frowning:

[code]
public String pesquisar() throws Exception {
UsuarioDAO buscardao = new UsuarioDAO();
buscardao.buscar(objUsuario.getNome());
return “/usuariolocalizado”;

}[/code]