[Resolvido] Filtro de SELECT em Banco de Dados

Pessoal,

Preciso dar um SELECT no DB com o seguinte metodo:

[code]public List imprimirPDF(Integer cdFc, Integer nrRgi, String nmTela,
String tpAcao, String cdUsuario) throws DAOException {

	try {

		if (cdFc != null || nrRgi != null || nmTela != "" || tpAcao != ""
				|| cdUsuario != "") {

			return super.executarBuscaNativa(

			" select * from FLC_LOG_LOG where CD_FC LIKE '" + cdFc
					+ "' AND NR_RGI LIKE '" + nrRgi
					+ "' AND NM_TELA LIKE '" + nmTela
					+ "' AND TP_ACAO LIKE '" + tpAcao
					+ "' AND CD_USUARIO LIKE '" + cdUsuario,

			new String[] { "CD_LOG", "DT_EVENTO", "CD_FC", "NR_RGI",
					"NM_FUNCIONALIDADE", "NM_TABELA", "TP_ACAO",
					"DS_ATRIBUTOS_SQL", "NM_TELA", "NM_PAGINA",
					"CD_USUARIO", "NR_CPF", "NR_RNE", "NR_CNPJ", "NR_IP",
					"NM_NAVEGADOR", "NR_RG" }

			);

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

	return null;
}

[/code]

No metodo MAIN eu testo passando apenas um dos parametros para tentar fazer a consulta:

[code]public static void main(String[] args) {

	try {

		List pdf = new FlcConsultarLogDAOImpl().imprimirPDF(
				new Integer(490), null, null, "", "", "", "", "", "",
				"", "", "", "", "", "", "");

		System.out.println("PDF: " + pdf);

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

}[/code]

estou tentando trazer um item da minha tabela passando apenas um dos filtros usando LIKE na minha query mas não estou conseguindo!
Alguem tem uma ideia de onde eu possa estar errand???

Desde ja
Obrigado pessoal

os mapeamentos do Hibernate e etc estão todos OK!

ele me tras isso =(

[code]Hibernate: select * from FLC_LOG_LOG where CD_LOG LIKE ‘490’ AND CD_FC LIKE ‘null’ AND NR_RGI LIKE ‘null’ AND NM_TELA LIKE ‘’ AND CD_USUARIO LIKE ‘’ AND TP_ACAO LIKE ’

PDF: null[/code]

Por que você está usando hibernate e ainda passa querys feitas no braço?

meu projeto ainda não esta pronto… Estou fazendo isso nesse metodo mainapenas para testar!

Ah certo. Então é isso mesmo, o hibernate já faria a consulta que você quiser, use o Criteria dele e passe os parâmetros que quiser.

Roberto, como você está usando o operador Like concatene o ‘%’ com os parâmetros que você está passando, por exemplo:

" select * from FLC_LOG_LOG where CD_LOG LIKE '" + cdLog + "%" +

e se eu fosse você passaria String ao invés de Integer, porque não existe null%.

Fala aI Rodolfo,

blz

tentei fazer o que vc disse, dessa forma

" select * from FLC_LOG_LOG where CD_LOG LIKE '"%" + cdLog + "%" + "' AND CD_FC LIKE '"%" + cdFc + "%" + "' AND NR_RGI LIKE '"%" + nrRgi + "%" + "' AND NM_TELA LIKE '"%" + nmTela + "%" + "' AND CD_USUARIO LIKE '"%" + cdUsuario + "%" + "' AND TP_ACAO LIKE '"%" + tpAcao + "%",

mas n obtive resultados cara =/

passa ai o resultado da sua sql que apareceu no console, dê System.out.print(sql) para podermos analisar o resultado.

Hibernate:  select * from FLC_LOG_LOG where CD_FC LIKE '490' AND NR_RGI LIKE 'null' AND NM_TELA LIKE '' AND TP_ACAO LIKE '' AND CD_USUARIO LIKE '

o systemOut do main

[code]public static void main(String[] args) {

	try {

		List pdf = new FlcConsultarLogDAOImpl().imprimirPDF(
				new Integer(490), null, "", "", "");

		System.out.println("PDF: " + pdf);

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

}[/code]

resultado:

PDF: null

[quote=Roberto Porto]Hibernate: select * from FLC_LOG_LOG where CD_FC LIKE '490' AND NR_RGI LIKE 'null' AND NM_TELA LIKE '' AND TP_ACAO LIKE '' AND CD_USUARIO LIKE '
[/quote]

[quote=Roberto Porto]List pdf = new FlcConsultarLogDAOImpl().imprimirPDF( new Integer(490), null, "", "", ""); [/quote]

Não passe como parâmetro o null, mude o argumento para String e passe uma string vazia “”, assim como você passou para os parâmetros posteriores. Da forma que você está fazendo o operador Like vai filtrar buscando no banco dados na coluna NR_RGI que tenham o valor literal null gravado e acredito que não seja o que você está pretendendo fazer.

Roberto,

Eu acho que você poderia tentar fazer usando criteria, depois quando tentar migrar vai dar muito trabalho

No Criteria basta fazer

caso a sua consulta seja muito complexa você ainda pode usar o named query do hibernate, melhor do que ficar criando o statement e colocando o SQL na mão

pois eh cara!

poderia me dar um exemplo de como faço isso dentro do meu contexto???

desde ja

mto obrigado

O que eu preciso pessoal eh que ao submeter diversos parametros de uma JSP que essa minha função reconheça quais vieram com valores atribuidos e faça o SELECT baseado nos parametros que recebeu! pode ser 1, 2 ou 3 ou TODOS os campos:

pelo menos teoricamente alguem poderia me dizer se algo nessa minha linha de raciocinio esta correto?

Por favor, qualquer ajuda eh bem vinda…

[code]public List imprimirPDF(Integer cdFc, Integer nrRgi, String nmTela,
String tpAcao, String cdUsuario) throws DAOException {

	try {

		if (cdFc != null || nrRgi != null || nmTela != "" || tpAcao != ""
				|| cdUsuario != "") {

			return super.executarBuscaNativa(

			" select * from FLC_LOG_LOG where CD_FC LIKE '" + cdFc
					+ "' AND NR_RGI LIKE '" + nrRgi
					+ "' AND NM_TELA LIKE '" + nmTela
					+ "' AND TP_ACAO LIKE '" + tpAcao
					+ "' AND CD_USUARIO LIKE '" + cdUsuario,

			new String[] { "CD_LOG", "DT_EVENTO", "CD_FC", "NR_RGI",
					"NM_FUNCIONALIDADE", "NM_TABELA", "TP_ACAO",
					"DS_ATRIBUTOS_SQL", "NM_TELA", "NM_PAGINA",
					"CD_USUARIO", "NR_CPF", "NR_RNE", "NR_CNPJ", "NR_IP",
					"NM_NAVEGADOR", "NR_RG" }

			);

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

	return null;
}[/code]

[quote=Roberto Porto]O que eu preciso pessoal eh que ao submeter diversos parametros de uma JSP que essa minha função reconheça quais vieram com valores atribuidos e faça o SELECT baseado nos parametros que recebeu! pode ser 1, 2 ou 3 ou TODOS os campos:

pelo menos teoricamente alguem poderia me dizer se algo nessa minha linha de raciocinio esta correto?

Por favor, qualquer ajuda eh bem vinda…

[code]public List imprimirPDF(Integer cdFc, Integer nrRgi, String nmTela,
String tpAcao, String cdUsuario) throws DAOException {

	try {

		if (cdFc != null || nrRgi != null || nmTela != "" || tpAcao != ""
				|| cdUsuario != "") {

			return super.executarBuscaNativa(

			" select * from FLC_LOG_LOG where CD_FC LIKE '" + cdFc
					+ "' AND NR_RGI LIKE '" + nrRgi
					+ "' AND NM_TELA LIKE '" + nmTela
					+ "' AND TP_ACAO LIKE '" + tpAcao
					+ "' AND CD_USUARIO LIKE '" + cdUsuario,

			new String[] { "CD_LOG", "DT_EVENTO", "CD_FC", "NR_RGI",
					"NM_FUNCIONALIDADE", "NM_TABELA", "TP_ACAO",
					"DS_ATRIBUTOS_SQL", "NM_TELA", "NM_PAGINA",
					"CD_USUARIO", "NR_CPF", "NR_RNE", "NR_CNPJ", "NR_IP",
					"NM_NAVEGADOR", "NR_RG" }

			);

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

	return null;
}[/code][/quote]

Oi Roberto,

Uma das coisas que você poderia fazer para facilitar é utilizar um operador ternário e depois um continue, algo parecido com isso

String cdFc = (request.getParameter("cdFc")!= null ? request.getParameter("cdFc") : null; String nrRgi = (request.getParameter("nrRgi")!= null ? request.getParameter("nrRgi") : null;

depois adicione em um List

List<String> listaParametros = new ArrayList<String>(); listaParametros.add(cdFc); listaParametros.add(nrRgi);

para montar o seu SQL

//select * from ? for (String param: listaParametros) { if (param==null) continue; //adiciona restrição no SQL }

para criar o critéria você vai ter que criar um mapeamento de um objeto para a sua tabela depois

Criteria c = session.createCriteria(minhatabela.class)
                 .add(Restrictions.like('nome','valor')
                 .add(Restrictions.like('nome2','valor2');

List results = c.list();

Achei alguns exemplos, vê se te ajuda

http://www.roseindia.net/hibernate/criteriaqueries.shtml
http://www.java2s.com/Tutorial/Java/0350__Hibernate/0260__Criteria.htm

Na minha opinião, se for para usar o Hibernate é legal usar as facilidades dele, não vale a pena usar ele apenas para controlar a session com o banco

t+

Fala ai André, blz

Muito obrigado pela suas dicas foram mto validas!

soh que agora estou tentando resolver dessa outra forma

como o amigo acima disse mudei de integer para String, acho que estou quase lá
Estou fazendo dessa forma:

[code]public List listarLogs(String cdFc, String nrRgi, String nmTela,
String tpAcao, String cdUsuario) throws DAOException {

                            // aqui
	cdFc = cdFc != null ? cdFc : "%"; 
	nrRgi = nrRgi != null ? nrRgi : "%"; 
	nmTela = nmTela != null ? nmTela : "%";
	tpAcao = tpAcao != null ? tpAcao : "%";
	cdUsuario = cdUsuario != null ? cdUsuario : "%";

	try {

		return super.executarBuscaNativa(  // aqui é o select do meu metodo que recebe os parametros do main

		" select * from FLC_LOG_LOG where CD_FC LIKE '" + cdFc
				+ "' AND NR_RGI LIKE '" + nrRgi + "' AND NM_TELA LIKE '"
				+ nmTela + "' AND TP_ACAO LIKE '" + tpAcao
				+ "' AND CD_USUARIO LIKE '" + cdUsuario,
				
									
		new String[] { "CD_LOG", "DT_EVENTO", "CD_FC", "NR_RGI",
				"NM_FUNCIONALIDADE", "NM_TABELA", "TP_ACAO",
				"DS_ATRIBUTOS_SQL", "NM_TELA", "NM_PAGINA", "CD_USUARIO",
				"NR_CPF", "NR_RNE", "NR_CNPJ", "NR_IP", "NM_NAVEGADOR",
				"NR_RG" }

		);

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

	return null;
}

NO MAIN

public static void main(String[] args) {

	try {

		System.out.println(new FlcConsultarLogDAOImpl()
                                                                                   .listarLogs("490", null, null, null, null));

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

}

[/code]

o problema agora é que esse select direto no SQL rola tranquilo, agora qdo chamo passando os parametros pelo meu metodo ele sempre me traz null cara!

creio que deva ser uma besteira que n estou enchergando
alguem saberia e dizer

Valeu ae pela força pessoal, especialmente ao Andre!

Se não for usar o Hibernate(a opção fácil), você vai ter que montar o teu SQL usando StringBuilders

StringBuilder sb = new StringBuilder("select * from FLC_LOG_LOG where");

if (cdFc != null)
  sb.append("CD_FC LIKE '").append(cdFc).append("'");

if (nrRgi != null)
  sb.append("NR_RGI  LIKE '").append(nrRgi).append("'");

(...)

Depois é só adaptar para adicionar mais ANDs quando tiver mais de uma operação, ou sempre adicionar os ANDs ao final, e depois da última condição, retirá-lo.

Fala ae Bruno,

consegui trazer os registros do banco de acordo com meu filtro:

desulpa ae o incomodo a todos! rsrs

era uma aspas que estava faltando no final do meu SELECT

o unico problema é que ele me retorna resultados assim:

[Ljava.lang.Object;@7ce0357c, [Ljava.lang.Object;@7c5bf57c, [Ljava.lang.Object;@7df1f57c, [Ljava.lang.Object;@7daff57c, [Ljava.lang.Object;@7eb6b57c, [Ljava.lang.Object;@34893578, [Ljava.lang.Object;@3775b579, [Ljava.lang.Object;@351d7579, [Ljava.lang.Object;@3457f579, [Ljava.lang.Object;@339cb579, [Ljava.lang.Object;@31b8b579, [Ljava.lang.Object;@305c7579, [Ljava.lang.Object;@4f16b579, [Ljava.lang.Object;@4ff97579, [Ljava.lang.Object;@4ef33579, [Ljava.lang.Object;@4b0bb579, [Ljava.lang.Object;@4beaf579]

tipo o cod do objeto

Obrigado Cara!
abs

Parece ser uma List preenchida por um array de objetos.

Verdade,

vou dar um jeito nisso Obrigado pessoal