Olá pessoal… há como realizar uma busca utilizando o Hibernate passando um objeto contendo apenas algumas informações armazenadas??
Por exemplo, se tenho uma classe Cliente e nela tenho:
nome;
idade;
endereco;
profissao;
Porém quero fazer um formulário onde o usuário digita apenas alguns dos dados e ele busca por todos os Clientes que têm os dados passados… por exemplo:
nome = “João”;
idade = 21;
endereco = null;
profissao = null;
Daí ele retornaria todos os Clientes em um List, que têm o nome João e 21 anos de idade…
Enfim, isso é possível?
Abraços…
Cabral
Abril 11, 2007, 12:54pm
#2
Ola arianostanley,
aqui temos uma superclasse que faz esse tipo de consulta, com o seguinte código:
[code]
public Collection findCriteriaByEntity(T object, String[] fieldsOrdinance)
throws DaoException {
Collection<T> list = null;
try {
session = HibernateUtil.currentSession();
Criteria criteria = mountDynaCriteria(session, object);
criteria.toString();
if (fieldsOrdinance != null) {
for (int i = 0; i < fieldsOrdinance.length; i++) {
criteria.addOrder(Order.asc(fieldsOrdinance[i]));
}
}
list = criteria.list();
// session.lock(list,LockMode.NONE);
} catch (Exception e) {
throw new DaoException("Erro executando findCriteria", e);
}
return list;
}[/code]
e na subclasse só setamos os atributos que queremos que ele faça a consulta:
[code]
public Collection buscarPessoaByEndereco(Endereco endereco)
throws DaoException {
Pessoa pessoa = new Peessoa();
pessoa.setEndereco(endereco);
return super.findCriteriaByEntity((T) endereco, null);[/code]
Espero que ajude.
Ricardo Cabral
passos
Abril 11, 2007, 2:24pm
#3
O Hibernate tem uma sacada muito legal que e o Example queries vc passa pra ele uma entidade e ele procura por todos os atributos nao nulos passados dentro da entidade. Ignorando versão, identificadores e associações.
E ae passos… era exatamente isso que eu queria… mas agora surgiu mais um empecilho…
Eu utilizo o SwingBean como framework pros formulários… e ele não seta os campos vazios como null, mas como “”… e o Hibernate acaba buscando no banco de dados por valores “” ao invés de ignorá-los…
Há como fazer pro Hibernate tratar os “” como null??
Abraços e obrigado…
passos
Abril 13, 2007, 10:56am
#5
Não que eu saiba ou ja tenha utilizado. Ate onde eu sei so tem excludeZeroes() ou excludeProperty(name).
Bem que eles podiam implementar algo do tipo excludeValue(“Um Valor Qualquer”) ou excludeValues(Uma Collection ou algo assim)
Nada implede que vc implemente isso mas vai dar um trabalho!
Enquanto isso vai na gambiarra mesmo… antes de enviar eu testo cada campo… se tiver “” eu seto como null mesmo! uhauha
Mas se eu descobrir uma maneira posto aqui…
Vlw pessoal… abraços!
passos
Abril 13, 2007, 2:52pm
#7
Estava pensando aqui com meus botões. Se tem como excluir os zeros, tem que ter como excluir as strings em branco.
Cria uma classe utilizaria:
public final class NotNullOrBlankPropertySelector implements PropertySelector {
public boolean include(Object object, String propertyName, Type type) {
return object!=null && (
!(object instanceof String) || !( (String) object ).equals("")
);
}
}
E no seu example set o PropertySelector
HibernateUtil.getSession()
.createCriteria(SuaEntidade.class)
.add( Example.create(suaInstancia).setPropertySelector(new NotNullOrBlankPropertySelector()) )
.list();
To pensando seriamente em pedir pra eles adicionarem isso na classe Example como uma propriedade excludeBlanks()
[update] Ja pedi so não sei se eles vão entender meu maldito ingles misturado com o portugues[/update]
Boa cara, vou enviar um e-mail pra eles também. Quanto mais pessoas pedirem melhor… abraços!
passos
Abril 13, 2007, 4:29pm
#9
[quote=Cabral]Ola arianostanley,
aqui temos uma superclasse que faz esse tipo de consulta, com o seguinte código:
[code]
public Collection findCriteriaByEntity(T object, String[] fieldsOrdinance)
throws DaoException {
Collection<T> list = null;
try {
session = HibernateUtil.currentSession();
Criteria criteria = mountDynaCriteria(session, object);
criteria.toString();
if (fieldsOrdinance != null) {
for (int i = 0; i < fieldsOrdinance.length; i++) {
criteria.addOrder(Order.asc(fieldsOrdinance[i]));
}
}
list = criteria.list();
// session.lock(list,LockMode.NONE);
} catch (Exception e) {
throw new DaoException("Erro executando findCriteria", e);
}
return list;
}[/code]
e na subclasse só setamos os atributos que queremos que ele faça a consulta:
[code]
public Collection buscarPessoaByEndereco(Endereco endereco)
throws DaoException {
Pessoa pessoa = new Peessoa();
pessoa.setEndereco(endereco);
return super.findCriteriaByEntity((T) endereco, null);[/code]
Espero que ajude.
Ricardo Cabral[/quote]
opa, você ainda tem a implementação desse createDynaCriteria()?