[RESOLVIDO] Como mapear um campo char do banco

27 respostas
douglascst90

Galera estou com problemas, tenho um campo do tipo char com tamanho 10 no banco que estou usando, porém nao consigo fazer o mapeamento correto desse campo, ja tentei as seguintes opções:

@Column(name="HIDROMETRO", columnDefinition="CHAR(10)") private char hidrometro;

@Column(name="HIDROMETRO", columnDefinition="CHAR(10)") private String hidrometro;

@Column(name="HIDROMETRO", length=10) private char hidrometro;

@Column(name="HIDROMETRO", length=10) private String hidrometro;

Sei que em o length nao funciona com valor do tipo char.

Alguem pode me dar uma luz de como fazer isso?? Obrigado.

27 Respostas

douglascst90

Ninguém pessoal?

gabrielfrios

Em um post aqui o cara resolveu dessa forma

http://www.guj.com.br/java/234864-campo-char-no-hibernate-com-anotacoes-resolvido

Mas parece que é como seu primeiro exemplo

douglascst90

Pois é ja li esse post, e msm assim nao da certo ele me retorna um valor . Existe alguns campos vazios na tabela, mas esse nao seria o problema né ?

gabrielfrios

Cara, se tiver null no banco vai retornar null sim. Faz só um if pra isso e testa ai.

douglascst90

Sim, mas existe 2000 registro no meu banco e alguns estao com esse campo vazio, entoa os outro ele me deveria retornar normal.

gabrielfrios

Mas está dando NullPointerException?

douglascst90

Assim ele gerar essa exception:

select this_.CODIGO as CODIGO0_0_, this_.COD_ENDERECO as COD2_0_0_, this_.DATA_HIDROMETRO as DATA3_0_0_, this_.HIDROMETRO as HIDROMETRO0_0_, this_.NOME_PROPRIETARIO as NOME5_0_0_, this_.NUMERO as NUMERO0_0_, this_.SEQUENCIA as SEQUENCIA0_0_ from CONTRIBUINTE this_ Grave: org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of br.com.agua.model.Contribuinte.hidrometro

douglascst90

Ele ate faz a consulta, repara que ele mostra no log a select q a criteria faz, mas em seguida gera a exception.

Rodrigo_Sasaki

Acho que ele está tentando setar null nos campos que vem vazio, mas como seu atributo é primitivo ele não vai permitir isso…
ja tentou usar Wrappers?

gabrielfrios

Cara tente usar a classe wrapper Char.

douglascst90

E quando eu tiro a anotação do campo HIDROMETRO, ele gera o json normalmente pra mim, e existe alguns campos q tbm estão vazios em determinados registros. E funciona normalmente, o problema é no campo HIDROMETRO.

douglascst90

wrapper? Desculpe a ignorancia mas não conheço essa classe.

gabrielfrios

Classes wrappers como Character (desculpe, coloquei Char), Integer, Double, Long.

Rodrigo_Sasaki

então.. cada tipo primitivo (char, int, double) possui uma classe que "encobre" ele adicionando funcionalidades que são respectivamente(Character, Integer, Double)

assim você tem instâncias de classe ao invés de tipos primitivos, e sendo instâncias, aceitam valor null... a idéia é substituir:

private char hidrometro;
por:
private Character hidometro;

se quiser ler mais sobre Wrappers leia esse artigo:

http://www.devmedia.com.br/conhecendo-as-classes-wrappers-autoboxing-e-auto-unboxing/7384

douglascst90

Tentei isso:

@Column(name="HIDROMETRO") private Character hidrometro;

Mas ele não encontra a pagina(404), estranho. Estou testando aqui!

gabrielfrios

Deve ter dado alguma Exception no console, se tiver, posta aqui

douglascst90

Ele simplesmente nao executa quando coloco Character

@Column(name="HIDROMETRO", columnDefinition="CHAR(10)") private Character hidrometro;

Mas qndo volto para char ele gera a exception.

gabrielfrios

Mas quando ele não executa, é gerado algum log no console?

douglascst90

Não, ele nem executa o metodo rest.

Rodrigo_Sasaki

o seu erro 404 é um problema.

o fato de não acontecer quando você usa char, é porque acontece um problema antes dele.

como o gabrielfrios disse, não aparece nada no console quando dá o erro 404 ?

douglascst90

puxa pessoal desculpa, acho q estava em cache e nao estava atualizando, agora veio o valor do campo hidrometro, mas exibe somente o primeiro caracter. Veja uma linha do resultado:
{“codigo”:19,“sequencia”:440,“nome_proprietario”:“ABDO AZIZ A.ISMAIL-ESPOLIO”,“hidrometro”:“A”,“cod_endereco”:30,“numero_casa”:139}

Repare que no “hidrometro” so me trouxe a letra ‘A’.

Rodrigo_Sasaki

mas o padrão do char não é justamente ter somente 1 caracter?

por que você não deixa seu atributo como String ?

douglascst90

Entao como eu disse no incio do post, ele gera um erro qndo uso String.

Grave: ... Initial SessionFactory creation failed: org.hibernate.HibernateException: Wrong column type: HIDROMETRO, expected: varchar(10) Grave: The exception contained within MappableContainerException could not be mapped to a response, re-throwing to the HTTP container java.lang.ExceptionInInitializerError

Lembrando que o campo HIDROMETRO no banco é um CHAR com tamanho 10.

gabrielfrios

Como está sua anotação nesse propriedade?

douglascst90

@Column(name="HIDROMETRO") private String hidrometro;

gabrielfrios

Coloque a propriedade columnDefinition=“char” na anotação.

@Column(name="HIDROMETRO", columnDefinition="char")
douglascst90

gabrielfrios:
Coloque a propriedade columnDefinition=“char” na anotação.

@Column(name="HIDROMETRO", columnDefinition="char")

Obrigado gabrielfrios, funcionou perfeitamente :smiley:

Abraços.

Criado 25 de abril de 2012
Ultima resposta 25 de abr. de 2012
Respostas 27
Participantes 3