[RESOLVIDO] Como mapear um campo char do banco

27 respostas
D

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

D

Ninguém pessoal?

G

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

D

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é ?

G

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

D

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

G

Mas está dando NullPointerException?

D

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

D

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

R

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?

G

Cara tente usar a classe wrapper Char.

D

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.

D

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

G

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

R

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

D

Tentei isso:

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

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

G

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

D

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.

G

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

D

Não, ele nem executa o metodo rest.

R

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 ?

D

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’.

R

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

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

D

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.

G

Como está sua anotação nesse propriedade?

D

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

G

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

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

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