Como passar campos nulos(opcionais) pelo PreparedStatement
Saudações a todos!
Tenho uma dúvida aqui e gostaria de uma mãozinha, se possível.
Estou usando o PreparedStatement para fazer as inclusões no banco de dados e, me surgiu a seguinte dúvida.....Como fazer pra passar um campo opcional(nulo) através deste objeto. Eu já testei e, pelo menos com o derby e o postgresql não funciona se o atributo Java estiver somente como null.
Para String, eu até consegui, fazendo uma verificação no método get do atributo. se estiver nulo então retorna ". Mas para outros tipos de dados como int, float e, principalmente datas eu não consegui resolver.
Então resolvi criar um método "montando" a string SQL a ser passada para o PreparedStatement, conforme abaixo:
Desse jeito até deu certo, contudo é uma forma pouco elegante e o código ficaria muito extenso para uma tabela com vários campos.
Além do mais, estou com problemas na comparação da data, onde, mesmo com o valor do atributo estando "null", ele não consegue verificar no If. Já tentei comparar com equals e nada feito. lembrando que o tipo definido no atributos na classe java é java.sql.Date.
Já pesquisei muito pela net, inclusive, vi muitos exemplos, onde a comparação da data foi feita com um simples "==null" mas são sei porque no meu caso não está funcionado.
Alguém conhece um jeito melhor para passar campos que podem não tem sito preenchidos no objeto para o banco de dados ??? e resolver este problema com a data?
Grato pela atenção,
Willian Cevassi
Tenho uma dúvida aqui e gostaria de uma mãozinha, se possível.
Estou usando o PreparedStatement para fazer as inclusões no banco de dados e, me surgiu a seguinte dúvida.....Como fazer pra passar um campo opcional(nulo) através deste objeto. Eu já testei e, pelo menos com o derby e o postgresql não funciona se o atributo Java estiver somente como null.
Para String, eu até consegui, fazendo uma verificação no método get do atributo. se estiver nulo então retorna ". Mas para outros tipos de dados como int, float e, principalmente datas eu não consegui resolver.
Então resolvi criar um método "montando" a string SQL a ser passada para o PreparedStatement, conforme abaixo:
private String montarParametros(Agenda agenda) { StringBuffer toReturn = new StringBuffer(); int numeroParamatros = 0; toReturn.append("INSERT INTO APP.AGENDA("); if(!agenda.getId().equals(null)){ toReturn.append("ID"); numeroParamatros++; } if(!agenda.getAnimal().equals(null)){ toReturn.append(",ID_ANIMAL"); numeroParamatros++; } if(!agenda.getTipo().equals(null));{ toReturn.append(",TIPO_SERVICO"); numeroParamatros++; }
if(agenda.getData()!=null);{ toReturn.append(",DATA"); numeroParamatros++; } toReturn.append(")VALUES("); for(int i=0; i< numeroParamatros; i++){ if(i < (numeroParamatros-1)) toReturn.append("?,"); else toReturn.append("?"); } toReturn.append(")"); return toReturn.toString(); }Desse jeito até deu certo, contudo é uma forma pouco elegante e o código ficaria muito extenso para uma tabela com vários campos.
Além do mais, estou com problemas na comparação da data, onde, mesmo com o valor do atributo estando "null", ele não consegue verificar no If. Já tentei comparar com equals e nada feito. lembrando que o tipo definido no atributos na classe java é java.sql.Date.
Já pesquisei muito pela net, inclusive, vi muitos exemplos, onde a comparação da data foi feita com um simples "==null" mas são sei porque no meu caso não está funcionado.
Alguém conhece um jeito melhor para passar campos que podem não tem sito preenchidos no objeto para o banco de dados ??? e resolver este problema com a data?
Grato pela atenção,
Willian Cevassi
Willian Cevassi
Curtidas 0
Respostas
Dyego Carmo
29/07/2010
Já experimentou , no lugar de colocar no SQL
"from tabela where campo = ?"
colocar:
"from tabela where campo is ?"
?
Teste e me avise.
"from tabela where campo = ?"
colocar:
"from tabela where campo is ?"
?
Teste e me avise.
GOSTEI 0
Dyego Carmo
29/07/2010
Falei besteira ali em cima... ESQUECA... eu nao li direito...
Teste NULL de objetos de outra forma...
no lugar de:
agenda.getAnimal().equals(null)
utilize:
agenda.getAnimal() == null
Teste NULL de objetos de outra forma...
no lugar de:
agenda.getAnimal().equals(null)
utilize:
agenda.getAnimal() == null
GOSTEI 0
Willian Cevassi
29/07/2010
Olá Dyego,
Primeiramente, agradeço a resposta e, também gostaria de parabenizá-lo. Aproveitando as férias da faculdade, resolvi fazer a assinatura da Java Magazine e estudar um pouco de Java. Tive uma grata surpresa com a qualidade das suas vídeos- aulas. As considero de fácil entendimento e, bastante objetivas, você vai direto ao ponto...Já assisti todas sobre o Hibernate e me foi muito proveitoso. Você está de parabéns.
Então...voltando ao problema... comparando tanto com "equals" quanto com "==" funcionam perfeitamente para os campos String, float, double, etc. o problema maior são com os campos do tipo java.sql.Date. Mesmo usando o operador de igualdade "== null", ele não consegue fazer a comparação.
Por exemplo, no trecho abaixo, mesmo estando o atributo "data" como null, ele executa a instrução dentro do if, quando, na verdade, não deveria.
if(agenda.getData()!=null);{ toReturn.append(",DATA"); numeroParamatros++;}
Eu já me bati bastante buscando alguma solução pela internet e até o momento nada. Nem encontrei uma forma mais elegante para fazer tudo isso... imagina só o tamanho do código se fosse um cadastro com vários campos...ficaria praticamente inviável fazer tantos if' s. Quando trata-se de campos do tipo String, achei até uma solução diferente. Como mencionei no primeiro post, fazenda a comparação no método "get", se for nulo mando retornar "", aí deu certo. mas esta solução só serve mesmo para campos String.
Por enquanto, a única forma que consegui pensar foi mesmo montar antecipadamente a instrução SQL como fiz lá em cima. Mas isso está me cheirando gambiarra! hehehehe..
Willian Cevassi
Primeiramente, agradeço a resposta e, também gostaria de parabenizá-lo. Aproveitando as férias da faculdade, resolvi fazer a assinatura da Java Magazine e estudar um pouco de Java. Tive uma grata surpresa com a qualidade das suas vídeos- aulas. As considero de fácil entendimento e, bastante objetivas, você vai direto ao ponto...Já assisti todas sobre o Hibernate e me foi muito proveitoso. Você está de parabéns.
Então...voltando ao problema... comparando tanto com "equals" quanto com "==" funcionam perfeitamente para os campos String, float, double, etc. o problema maior são com os campos do tipo java.sql.Date. Mesmo usando o operador de igualdade "== null", ele não consegue fazer a comparação.
Por exemplo, no trecho abaixo, mesmo estando o atributo "data" como null, ele executa a instrução dentro do if, quando, na verdade, não deveria.
if(agenda.getData()!=null);{ toReturn.append(",DATA"); numeroParamatros++;}
Eu já me bati bastante buscando alguma solução pela internet e até o momento nada. Nem encontrei uma forma mais elegante para fazer tudo isso... imagina só o tamanho do código se fosse um cadastro com vários campos...ficaria praticamente inviável fazer tantos if' s. Quando trata-se de campos do tipo String, achei até uma solução diferente. Como mencionei no primeiro post, fazenda a comparação no método "get", se for nulo mando retornar "", aí deu certo. mas esta solução só serve mesmo para campos String.
Por enquanto, a única forma que consegui pensar foi mesmo montar antecipadamente a instrução SQL como fiz lá em cima. Mas isso está me cheirando gambiarra! hehehehe..
Willian Cevassi
GOSTEI 0
Luis Garcia
29/07/2010
Will, Blz?
Só algumas considerações:
1 - Tem algum sentido validar se o ID está nulo? Sendo que ele deve ser a PK da tabela...
2 - Já tentou ao invés de JDBC, usar Hibernate? Acho que ele encapsula esse tipo de coisa pra você...
3 - Os campos em que está tentando inserir nulo, podem receber nulo? Estou perguntando porque fiz o teste aqui e consegui inserir nulo em campo data e outro numérico, mas é um banco Oracle.
4 - A data está realmente vindo nula? Pq se sim, apenas fazendo um "==" deveria funcionar. Pode verificar se não está vindo nenhuma data do tipo "1900-01-01".
Qualquer coisa, posta aí!
Abraço.
Só algumas considerações:
1 - Tem algum sentido validar se o ID está nulo? Sendo que ele deve ser a PK da tabela...
2 - Já tentou ao invés de JDBC, usar Hibernate? Acho que ele encapsula esse tipo de coisa pra você...
3 - Os campos em que está tentando inserir nulo, podem receber nulo? Estou perguntando porque fiz o teste aqui e consegui inserir nulo em campo data e outro numérico, mas é um banco Oracle.
4 - A data está realmente vindo nula? Pq se sim, apenas fazendo um "==" deveria funcionar. Pode verificar se não está vindo nenhuma data do tipo "1900-01-01".
Qualquer coisa, posta aí!
Abraço.
GOSTEI 0
Dyego Carmo
29/07/2010
Vote um :
System.out.println(agenda.getDate())
logo abaixo do seu if (dentro dele)
Execute o codigo e passe a data como null... e cole o que aparece no console aqui...
Assim poderemos ver :)
System.out.println(agenda.getDate())
logo abaixo do seu if (dentro dele)
Execute o codigo e passe a data como null... e cole o que aparece no console aqui...
Assim poderemos ver :)
GOSTEI 0
Willian Cevassi
29/07/2010
Boa noite Luiz Carlos.
Agradeço a sua resposta. Então..sei que não faz sentido verificar se o ID é nulo. Eu só estava mesmo fazendo uns testes aqui, porque depois de implementar a camada de apresentação com Swing, os atributos foram populados corretamente. A data por exemplo, quando o JTextField da data fica em branco ele populou corretamente a propriedade e tudo correu perfeitamente.
Eu só estava testando mesmo as possibilidades de campos serem passados nulos ao PreparedStatement, nos testes unitários.
De qualquer forma achei bastante estranho aquele comportamento. Fiz o que o Diego falou a baixo e obtive como do System.out.printf(agenda.getData()) a string "null", como deveria ser mesmo. Quando você falou do banco, eu criei um novo banco no postgreSQL (eu tava usando o javaDB) e aí funcionou com o mesmo código... Esquisito né? hehehehehe
De qualquer forma, com o Swing deu tudo certo...
Obrigado a todos pela ajuda e, me desculpe pelo incomodo!
Willian Cevassi
Agradeço a sua resposta. Então..sei que não faz sentido verificar se o ID é nulo. Eu só estava mesmo fazendo uns testes aqui, porque depois de implementar a camada de apresentação com Swing, os atributos foram populados corretamente. A data por exemplo, quando o JTextField da data fica em branco ele populou corretamente a propriedade e tudo correu perfeitamente.
Eu só estava testando mesmo as possibilidades de campos serem passados nulos ao PreparedStatement, nos testes unitários.
De qualquer forma achei bastante estranho aquele comportamento. Fiz o que o Diego falou a baixo e obtive como do System.out.printf(agenda.getData()) a string "null", como deveria ser mesmo. Quando você falou do banco, eu criei um novo banco no postgreSQL (eu tava usando o javaDB) e aí funcionou com o mesmo código... Esquisito né? hehehehehe
De qualquer forma, com o Swing deu tudo certo...
Obrigado a todos pela ajuda e, me desculpe pelo incomodo!
Willian Cevassi
GOSTEI 0
Willian Cevassi
29/07/2010
Diego,
Obrigado pela ajuda! Agora, com o Swing está tudo ok!
Abraço,
Willian
Obrigado pela ajuda! Agora, com o Swing está tudo ok!
Abraço,
Willian
GOSTEI 0