Hibernate Criteria
Possuo uma tabela Produtos assim definida:
codigo Nome codigoDetalhado Status
100 xxxxxxxxxxxxxxxxx 100302202 A
101 zzzzzzzzzzzzzzzzz 100302221 I
102 vvvvvvvvvvvvvvvvv 200302223 A
103 mmmmmmmmmmm 200302244 A
104 qqqqqqqqqqqqqqqqq 200402202 I
105 rrrrrrrrrrrrrrrrr 300502202 A
Tenho utilizado o codigo Hibernate abaixo para filtrar meus dados
public List<Produtos> listarProd(){
Criteria c = session.createCriteria(Produtos.class);
c.add(Restrictions.eq("Status", "A"));
c.addOrder(Order.asc("Nome"));
return c.list();
Até o momento isso tem me atendido prontamente, porém, agora necessito
recperar os produtos, cujo <codigoDetalhado> se iniciem por 1,2, ou 3,
conforme escolha do usuário (primeira posição a esquerda do campo).
Alguem poderia me dar uma luz de como definir isso no Hibernate??? Alias
esse <codigoDetalhado> é numérico de 9 posições.
codigo Nome codigoDetalhado Status
100 xxxxxxxxxxxxxxxxx 100302202 A
101 zzzzzzzzzzzzzzzzz 100302221 I
102 vvvvvvvvvvvvvvvvv 200302223 A
103 mmmmmmmmmmm 200302244 A
104 qqqqqqqqqqqqqqqqq 200402202 I
105 rrrrrrrrrrrrrrrrr 300502202 A
Tenho utilizado o codigo Hibernate abaixo para filtrar meus dados
public List<Produtos> listarProd(){
Criteria c = session.createCriteria(Produtos.class);
c.add(Restrictions.eq("Status", "A"));
c.addOrder(Order.asc("Nome"));
return c.list();
Até o momento isso tem me atendido prontamente, porém, agora necessito
recperar os produtos, cujo <codigoDetalhado> se iniciem por 1,2, ou 3,
conforme escolha do usuário (primeira posição a esquerda do campo).
Alguem poderia me dar uma luz de como definir isso no Hibernate??? Alias
esse <codigoDetalhado> é numérico de 9 posições.
Galvez
Curtidas 0
Respostas
Davi Costa
04/10/2010
Vai depender de que tipo é seu campo código.
Se for String é só colocar:
c.add(Restrictions.like("codigo", "%1"));
Se for String é só colocar:
c.add(Restrictions.like("codigo", "%1"));
GOSTEI 0
Galvez
04/10/2010
Caro Davi
Esse é o problema. Meu campo é numérico de 9 posições (base oracle). No PL/SQL do Oracle e no Adobe Flex até consigo manipular esse campo, pegando parte dele com SUBSTR ou comando semelhante. O que não sei é fazer isso no HIbernate.
Por ex:
O usuario informa o nr 2 num determinado campo auxiliar _codigo. Ai preciso comparar com a primeira posicao desse campo codigodetalhado.
c.add(Restrictions.eq("codigodetalhado", _codigo));
mas como informar a ele que quero comparar a primeira posição a esquerda do codigodetalhado com _codigo???
Esse é o problema. Meu campo é numérico de 9 posições (base oracle). No PL/SQL do Oracle e no Adobe Flex até consigo manipular esse campo, pegando parte dele com SUBSTR ou comando semelhante. O que não sei é fazer isso no HIbernate.
Por ex:
O usuario informa o nr 2 num determinado campo auxiliar _codigo. Ai preciso comparar com a primeira posicao desse campo codigodetalhado.
c.add(Restrictions.eq("codigodetalhado", _codigo));
mas como informar a ele que quero comparar a primeira posição a esquerda do codigodetalhado com _codigo???
GOSTEI 0
Davi Costa
04/10/2010
De ante mão,
tem como vc usar native query com hibernate, com pouquíssima pesquisa vc acha alguma solução na internet.
Uma preocupação a menos,
porém isso tem um peso, alguns bancos tem funções próprias fantásticas como oracle, postgresql...
mas deixa tua aplicação acoplada ao seu banco... que é justamente o que o hibernate não quer.
Meu concelho é tentar usar o mínimo possível as funções exclusivas do teu banco, infelizmente o SQL ANSI nativão
mesmo nem sempre vai atender a todos os casos, não posso afirmar se vai atender ao seu, mas pelo menos vc tem que estar ciente que caso haja uma mudança de banco, vai ter que ser pensado uma refatoração em cima desse caso de uso.
Att Davi
tem como vc usar native query com hibernate, com pouquíssima pesquisa vc acha alguma solução na internet.
Uma preocupação a menos,
porém isso tem um peso, alguns bancos tem funções próprias fantásticas como oracle, postgresql...
mas deixa tua aplicação acoplada ao seu banco... que é justamente o que o hibernate não quer.
Meu concelho é tentar usar o mínimo possível as funções exclusivas do teu banco, infelizmente o SQL ANSI nativão
mesmo nem sempre vai atender a todos os casos, não posso afirmar se vai atender ao seu, mas pelo menos vc tem que estar ciente que caso haja uma mudança de banco, vai ter que ser pensado uma refatoração em cima desse caso de uso.
Att Davi
GOSTEI 0
Dyego Carmo
04/10/2010
Resolvido ?
GOSTEI 0
Galvez
04/10/2010
Caro Dyego
Ainda não resolvi da forma deseja, por exemplo utilizando ums função similiar ao substr do Oracle. Não existe isso no HIbernate?
Ainda não resolvi da forma deseja, por exemplo utilizando ums função similiar ao substr do Oracle. Não existe isso no HIbernate?
GOSTEI 0
Dyego Carmo
04/10/2010
Não , não existe , voce vai OU precisar fazer um QUERY NATIVA OU criar um substituto para funcao DIRETO no objeto...
NEste caso acho que vai precisar de uma query nativa mesmo :(
NEste caso acho que vai precisar de uma query nativa mesmo :(
GOSTEI 0