Dúvidas com consulta SQL

16 respostas
M

Pessoal, bom dia, estou com uma dúvida, tenho que fazer um sistema de busca por palavras chave em 3 tabelas, tabela arquivo, tabela frente, e tabela servico, as 3 se completam em um dado so…

ai o cliente tera a tela de busca com o nome da unidade, mes, ano, palavra chave, numero do contrato, ele iria digitar em qualquer um desses campos a informacao que gostaria de buscar e iria clicar em pesquisar, eu consegui fazer a consulta individualmente, com o comando like, porem o cliente quer que tenha somente um botao de pesquisa e todos os campos para ele preencher ou nao, por exemplo ele quer pesquisar pelo nome da unidade e o mes, ele iria digitar esses 2 campos, clicaria em pesquisar e o sql faria o resto pra ele, mas nao estou conseguindo, pois na consulta sql teria que constar todos os campos da tabela, mas nao sei como fazer, alguem me ajuda? segue o exemplo que eu fiz, mas so serve para pesquisa especifica, tem q ser digitado essa informacao pra pesquisa funcionar. segue

lista pelo nome da frente, mes ano e palavra chave
select a.*,f.*,s.* from arquivo a, frente f, servico s where f.nomeFrente='p-26' and (a.periodo1 like '%outubro%' and a.ano1='2010' or a.periodo2 like '%janeiro%' and a.ano2='2010') and f.idfrente = a.idfrente and s.idservico = a.idservico and s.descricaoServico like '%caixa de mar%'

agradeço a todos desde já

16 Respostas

drigo.angelo

Talvez seja o caso de usar o operador UNION do SQL… ou ele quer que seja retornada a disjunção dos resultados?

E

tenta assim:

String query = "select a.*,f.*,s.* from arquivo a, frente f, servico s where 1=1 ";

if(nomefrente!=null)
{
query+=" and a.nomeFrente = <valor>";
}
if(periodo1 != null)
{
query+=" and periodo1 like <%valor%>";
}

... e vai fazendo no if e somando a string existente...

...depois de todas as condições definidas...

Statement state = conexao.CreateStatement(query);
ResultSet =state.executeQuery();

pelo q eu entendi vc qer buscar por parametro informado… eu normalmente faço isso…

Rodrigo_Kossmann

Se foi o que eu entendi, é meio chatinho isso…
Cara, para começar, cada parâmetro de busca devera ser no comando SQL uma cláusula de restrição a mais. Uma idéia para resolver seria ter, para cada campo de pesquisa, uma restrição a mais que devera ser concatenada no comando SQL.
Por exemplo: se pesquisar por “unidade”, concatene no comando a restrição para essa busca, e, como os outros parametros não foram digitados, não concatene.
Ficaria mais ou menos assim:

String restricao1 = "";
		String restricao2 = "";
		if(campoRestricao1.text!=null) {
			restricao1 = "restricao1 = " + campoRestricao;
		}
		String comando = "select a.*,f.*,s.* from arquivo a, frente f, servico s where " + restricao1 + restricao2; 
	}

Talvez até tenha solução melhores, mas esse é um jeito.

Obs1: Lembre de fazer uma verificação no campo na tela verificando se o usuario coloque alguma restrição a mais. Seria possivel, sem isso, colocar um comando “and x = y”, caso o usuario tenha algum conhecimento de SQL.
Obs2: Voce tera que pensar em uma forma de arranjar o “and” entre as restrições. Caso faça desse jeito, vai entender quando botar a mão para programar.

Rodrigo_Kossmann

els1234:
tenta assim:

String query = "select a.*,f.*,s.* from arquivo a, frente f, servico s where 1=1 ";

if(nomefrente!=null)
{
query+=" and a.nomeFrente = <valor>";
}
if(periodo1 != null)
{
query+=" and periodo1 like <%valor%>";
}

... e vai fazendo no if e somando a string existente...

...depois de todas as condições definidas...

Statement state = conexao.CreateStatement(query);
ResultSet =state.executeQuery();

pelo q eu entendi vc qer buscar por parametro informado… eu normalmente faço isso…

O amigo teve a mesma ideia, postamos bem dizer junto… ehehe

Cara, acho que é por ai mesmo que resolve o problema

M

Pessoal, obrigado pela dica, mas eu sou iniciante, ainda nao entendi bem , esta clareando, mas ainda nao entendi, qual exemplo eu deveria usar?? o primeiro ou o segundo? e a sql ja com os ifs definidos, ficaria como? a primeira eu nao entendi bem, mas a segunda deu uma clareada pq estava + restricao1 etc, mas kd o like?? os comandos sql? me ajudem ae, e desculpe a ignorancia, sou completamente iniciante em programacao

agradeco desde ja

M

estava pensando em fazer assim:

select a.id,a.numerocontrato,f.nomeFrente,s.descricaoServico from arquivo a, frente f, servico s where (a.numerocontrato like '%null%') or (a.periodo1 like '%%' or a.ano1 like '%%') or (a.periodo2 like '%%' or a.ano2 like '%%') and (f.nomeFrente like'%p-26%') and (f.idfrente = a.idfrente and s.idservico = a.idservico) group by a.idfrente

mas como supus que o cliente digitou somente o nome da frente, p-26 mas ai eu tenho 2 registros para teste, e busca os 2 registros repetindo o servico feito na p-26

Rodrigo_Kossmann

Cara, nós usamos apenas um modelo de como deve ser feito, e ambos usam a mesma idéia. Se na tua regra de negocia precise de um like, use.

Basicamente, no Java, o metodo prepareStatement recebe uma String, e essa string é o comando SQL que será enviado ao banco.

A nossa ideia é a seguinte: caso o usuario digite algo em um campo de busca, o seu programa deve identificar se foi escrito algo, e acrescentar junto a String do comando SQL a restrição que o cliente quer.
Por exemplo: se o seu cliente quer fazer uma busca por nomeFrente, voce deve identificar se foi escrito alguma coisa em tela. Se foi, devera fazer a clausula de restrição, e juntar junto com o resto do comando SQL. Caso não tenha escrito no campo de nomeFrente, essa restrição não deve ir na consulta.
Caso ele queira fazer a consulta por nomeFrente e por periodo2, voce deve identificar que foi escrito algo nos campos, e juntar junto ao comando SQL as restrições.

Cara, qualquer duvida, posta de novo aqui.;

M

acho que eu entendi rodrigo, eu vou tentar aqui e ja retorno pra vcs
obrigado pelas dicas

M

eu já entendi o conceito e estava ate tentando, porem, fazendo os testes, se eu nao colocar nada no campo, nao apaga na query…

vou mostrar oq fiz

public class teste {
	public static void main(String[] args) {
		String query = "select a.*,f.*,s.* from arquivo a, frente f, servico s where 1=1 ";  
		
		String contrato = "556";
		String nomefrente = "";
		String mes = "JANEIRO";
		String ano = "2010";
		String palavraChave = "";
					
		if (contrato != null)  
		{  
		query+=" and a.numerocontrato like " +"%"+contrato+"%";
		} 
						
		if (nomefrente!=null) {
			query+=" and f.nomeFrente like "+"%"+nomefrente+"%";
		}
		
		if (mes != null) {
		query+=" and a.periodo1 like "+"%"+mes+"%";
		}
		
		if (ano != null) {
			query+=" and a.ano1 like "+"%"+ano+"%";
		}
		
		if (palavraChave != null) {
			query+=" and s.descricaoServico like "+"%"+palavraChave+"%";
		}
		
		System.out.println(contrato);
		
		System.out.println(query);
	}

	
}

e o resultado é este, veja que nao apagou da query, e sim deixou como nullo e assim da erro na consulta

select a.*,f.*,s.* from arquivo a, frente f, servico s where 1=1  and a.numerocontrato like %dd33d% and f.nomeFrente like %1% and a.periodo1 like %JANEIRO% and a.ano1 like %2010% and s.descricaoServico like %%
M

tentei de tudo pra corrigir este problema, mas nao consegui nao

R

ué… vc atribuiu vazio à palavra chave… ela nunca ta null dae vai sempre entrar no ultimo IF por exemplo

se vc tivesse colocado

if ( !palavraChave.equals(""))

teria dado certo =)

M

valeu cara, vou tentar aqui!!
abração

M

Cara, eu fiz aqui… arrumou o sql, porem ta dando java.lang.NullPointerException no DAO…

sera que consegue me ajudar??
vou postar o código DAO e o JSP

public List<Arquivo> buscaDocumentos(Arquivo arquivo) throws SQLException {
		List<Arquivo> arquivos = new ArrayList<Arquivo>();
		PreparedStatement stmt;
		
		String query = "select a.*,f.*,s.* from arquivo a, frente f, servico s where a.idfrente = f.idfrente and a.idservico = s.idservico ";  
		stmt = connection.prepareStatement(query);
		
		Arquivo arq = new Arquivo();
		
		String contrato = arq.getNumerocontrato();
		String nomefrente = arq.getFrente().getNomeFrente();
		String mes = arq.getMes();
		String ano = arq.getAno();
		String palavraChave = arq.getServico().getDescricaoServico();
					
		if (!contrato.equals(""))  
		{  
		query+=" and a.numerocontrato like " +"%"+contrato+"%";
		} 
						
		if (!nomefrente.equals("")) {
			query+=" and f.nomeFrente like "+"%"+nomefrente+"%";
		}
		
		if (!mes.equals("")) {
		query+=" and a.periodo1 like "+"%"+mes+"%"+" or a.periodo2 like "+"%"+mes+"%"+"";
		}
		
		if (!ano.equals("")) {
			query+=" and a.ano1 like "+"%"+ano+"%"+" or a.ano2 like "+"%"+ano+"%" ;
		}
		
		if (!palavraChave.equals("")) {
			query+=" and s.descricaoServico like "+"%"+palavraChave+"%";
		}
		
		ResultSet rs = stmt.executeQuery();
		
			while (rs.next()){
				arquivos.add(populaDocumentos(rs));
			}
			rs.close();   
			stmt.close();  
		
			return arquivos;
		
		
	}

	private Arquivo populaDocumentos(ResultSet rs) throws SQLException {
		Arquivo arquivo = new Arquivo();
		
		arquivo.setFrente(new Frente());
		arquivo.setServico(new Servico());
		
		arquivo.setNumerocontrato(rs.getString("numerocontrato"));
		arquivo.getFrente().setNomeFrente(rs.getString("nomeFrente"));
		arquivo.setMes(rs.getString("periodo1"));
		arquivo.setAno(rs.getString("ano1"));
		arquivo.getServico().setDescricaoServico(rs.getString("descricaoServico"));
		return arquivo;
	}

agora o jsp

<form id="buscaDocumentos" name="buscaDocumentos" method="post" action="buscaDocumentos">
  <table align="center" width="90%">
  <tr>
  
  <td>
  <label>Número do contrato</label></td>
  <td>
  <input type="text" name="arquivo.numerocontrato" id="arquivo.numerocontrato"/>
  </td>
  <td>
 
  <label>Nome da Unidade:</label>
  <input type="text" name="arquivo.frente.nomeFrente" id="arquivo.frente.nomeFrente"/>
  </td>
  </tr>
  
  <tr>
  	<td>
  	<label>Mes:</label></td>
  	
  	<td>
  	<input type="text" name="arquivo.mes" id="arquivo.mes"/>
  	</td>
  	
  	<td><label>Ano:</label>
  	<input type="text" name="arquivo.ano" id="arquivo.ano"/>
  	
  </tr>
  
  
  <tr>
  	<td>
  	<label>Palavra Chave:</label></td>
   	<td>
  	<input type="text" name="arquivo.servico.descricaoServico" id="arquivo.servico.descricaoServico"/>
  	</td>
  </tr>
  
  <tr>
  <td><input type="submit" value="Pesquisar"/></td>
  </tr>  
  
  
  </table>
  </form>

o erro:

java.lang.NullPointerException
	br.com.arquivo.DAO.ControleDocumentosDAO.buscaDocumentos(ControleDocumentosDAO.java:118)
	br.com.arquivo.action.ControleDocumentosAction.execute2(ControleDocumentosAction.java:46)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	java.lang.reflect.Method.invoke(Method.java:616)

nos testes que eu fiz, deu erro nessas linhas:

String contrato = arq.getNumerocontrato();
		String nomefrente = arq.getFrente().getNomeFrente();
		String mes = arq.getMes();
		String ano = arq.getAno();
		String palavraChave = arq.getServico().getDescricaoServico();
					
		if (!contrato.equals(""))  
		{  
		query+=" and a.numerocontrato like " +"%"+contrato+"%";
		}

agradeço desde já

M

ta funcionando mais ou menos agora, esta dando um erro, consegui resolver um e entrei em outro que nao to conseguindo resolver, a query sql nao ta formando direito, segue o codiog, espero q me ajudem

public List<Arquivo> buscaDocumentos(Arquivo arquivo) throws SQLException {
		List<Arquivo> arquivos = new ArrayList<Arquivo>();
		PreparedStatement stmt;
		String contrato = arquivo.getNumerocontrato();
		String nomefrente = arquivo.getFrente().getNomeFrente();
		String mes = arquivo.getMes();
		String ano = arquivo.getAno();
		String palavraChave = arquivo.getServico().getDescricaoServico();
		
		String query = "select a.*,f.*,s.* from arquivo a, frente f, servico s where a.idfrente = f.idfrente and a.idservico = s.idservico ";  
		
		
		System.out.println(query);
		
		
					
		if (!contrato.equals(""))  
		{  
		query+=" and a.numerocontrato like " +"?"+contrato+"%"+"?";
		} 
						
		if (!nomefrente.equals("")) {
			query+=" and f.nomeFrente like "+"?"+nomefrente+"%"+"?";
		}
		
		if (!mes.equals("")) {
		query+=" and a.periodo1 like "+"?"+mes+"%"+"?"+" or a.periodo2 like "+"?"+mes+"%"+"?"+"";
		}
		
		if (!ano.equals("")) {
			query+=" and a.ano1 like "+"?"+ano+"%"+"?"+" or a.ano2 like "+"?"+ano+"%"+"?" ;
		}
		
		if (!palavraChave.equals("")) {
			query+=" and s.descricaoServico like "+"?"+palavraChave+"%"+"?";
		}
		
		stmt = connection.prepareStatement(query);
		ResultSet rs = stmt.executeQuery();
		
			while (rs.next()){
				arquivos.add(populaDocumentos(rs));
			}
			rs.close();   
			stmt.close();  
		
			return arquivos;
		
		
	}

	private Arquivo populaDocumentos(ResultSet rs) throws SQLException {
		Arquivo arquivo = new Arquivo();
		
		arquivo.setFrente(new Frente());
		arquivo.setServico(new Servico());
		
		arquivo.setNumerocontrato(rs.getString("numerocontrato"));
		arquivo.getFrente().setNomeFrente(rs.getString("nomeFrente"));
		arquivo.setMes(rs.getString("periodo1"));
		arquivo.setAno(rs.getString("ano1"));
		arquivo.getServico().setDescricaoServico(rs.getString("descricaoServico"));
		return arquivo;
	}

mandei imprimir a query pra saber como fica, e so escreve isso select a.,f.,s.* from arquivo a, frente f, servico s where a.idfrente = f.idfrente and a.idservico = s.idservico

e da esse erro no jsp

java.sql.SQLException: No value specified for parameter 1
	com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
	com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
	com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
	com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
	com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2560)
	com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2536)
	com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2462)
	com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2216)
	br.com.arquivo.DAO.ControleDocumentosDAO.buscaDocumentos(ControleDocumentosDAO.java:144)
	br.com.arquivo.action.ControleDocumentosAction.execute2(ControleDocumentosAction.java:46)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

a linha 144 aponta para o resultset

espero q me ajudem.

R

vc populou o arquivo? nao entendi… agora o erro nao eh mais SQL mas na sua logica de programacao

naquelas linhas que deu erro, coloca um try/catch com um printstacktrace e declara o thows onde vc acha que pode ter acontecido e qndo acontecer o erro coloca a pilha de erro aqui…

nao sei como eh sua classe arquivo ou se ela ja foi populada entao nao da pra te falar ainda…

M

o erro estava acontecendo pq eu criei um objeto arquivo chamado arq e ja tinha um objeto arquivo chamado arquivo.

ta funcionando mais ou menos agora, esta dando um erro, consegui resolver um e entrei em outro que nao to conseguindo resolver, a query sql nao ta formando direito, segue o codiog, espero q me ajudem

public List<Arquivo> buscaDocumentos(Arquivo arquivo) throws SQLException {
		List<Arquivo> arquivos = new ArrayList<Arquivo>();
		PreparedStatement stmt;
		String contrato = arquivo.getNumerocontrato();
		String nomefrente = arquivo.getFrente().getNomeFrente();
		String mes = arquivo.getMes();
		String ano = arquivo.getAno();
		String palavraChave = arquivo.getServico().getDescricaoServico();
		
		String query = "select a.*,f.*,s.* from arquivo a, frente f, servico s where a.idfrente = f.idfrente and a.idservico = s.idservico ";  
		
		
		System.out.println(query);
		
		
					
		if (!contrato.equals(""))  
		{  
		query+=" and a.numerocontrato like " +"?"+contrato+"%"+"?";
		} 
						
		if (!nomefrente.equals("")) {
			query+=" and f.nomeFrente like "+"?"+nomefrente+"%"+"?";
		}
		
		if (!mes.equals("")) {
		query+=" and a.periodo1 like "+"?"+mes+"%"+"?"+" or a.periodo2 like "+"?"+mes+"%"+"?"+"";
		}
		
		if (!ano.equals("")) {
			query+=" and a.ano1 like "+"?"+ano+"%"+"?"+" or a.ano2 like "+"?"+ano+"%"+"?" ;
		}
		
		if (!palavraChave.equals("")) {
			query+=" and s.descricaoServico like "+"?"+palavraChave+"%"+"?";
		}
		
		stmt = connection.prepareStatement(query);
		ResultSet rs = stmt.executeQuery();
		
			while (rs.next()){
				arquivos.add(populaDocumentos(rs));
			}
			rs.close();   
			stmt.close();  
		
			return arquivos;
		
		
	}

	private Arquivo populaDocumentos(ResultSet rs) throws SQLException {
		Arquivo arquivo = new Arquivo();
		
		arquivo.setFrente(new Frente());
		arquivo.setServico(new Servico());
		
		arquivo.setNumerocontrato(rs.getString("numerocontrato"));
		arquivo.getFrente().setNomeFrente(rs.getString("nomeFrente"));
		arquivo.setMes(rs.getString("periodo1"));
		arquivo.setAno(rs.getString("ano1"));
		arquivo.getServico().setDescricaoServico(rs.getString("descricaoServico"));
		return arquivo;
	}

mandei imprimir a query pra saber como fica, e so escreve isso select a.,f.,s.* from arquivo a, frente f, servico s where a.idfrente = f.idfrente and a.idservico = s.idservico

e da esse erro no jsp

java.sql.SQLException: No value specified for parameter 1
	com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
	com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
	com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
	com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
	com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2560)
	com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2536)
	com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2462)
	com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2216)
	br.com.arquivo.DAO.ControleDocumentosDAO.buscaDocumentos(ControleDocumentosDAO.java:144)
	br.com.arquivo.action.ControleDocumentosAction.execute2(ControleDocumentosAction.java:46)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

a linha 144 aponta para o resultset

espero q me ajudem.

Criado 25 de março de 2011
Ultima resposta 26 de mar. de 2011
Respostas 16
Participantes 5