Uso este método em diversos módulos do sistema e ele funciona perfeitamente. Porém, em uma das páginas (desenvolvidas em JSF) do sistema eu preciso selecionar dois objetos de mesmo tipo (mais especificamente, do tipo Funcionario) a partir de comboboxes: um que será o funcionário requisitante e o outro que será o funcionário requisitado.
Quando eu seleciono qualquer funcionário do combobox que não seja o primeiro da lista (supondo que este primeiro da lista seja “Beltrano da Silva”), acontece o seguinte: antes de entrar neste método, o sistema sabe que deve pegar o nome do funcionário escolhido (portanto, String nomeDoCampo = “nome” e Object valor = “Fulano de Tal”) e, até retornoValor, ele pega corretamente (se, abaixo de Criterion retornoValor = Restrictions.gt(nomeDoCampo, valor); eu fizer System.out.println("Retorno valor é: " + retornoValor.toString()), aparece:
Ou seja, está sendo obtido do banco a coluna certa (“nome”) e o campo certo (“Fulano de Tal”). Então até agora tudo bem. Porém, na saída deste método (assim que ele sai do método), o funcionário que ele retorna é “Beltrano da Silva”, que é o primeiro da lista.
Ou seja, alguma coisa acontece durante:
Na verdade isso: criteria.setMaxResults(1); não tem necessidade alguma.
Você não está gerando uma lista e sim um resultado único, então não precisa setar isso.
Tentou tirar essa linha para ver se o resultado é o esperado?
E outra coisa. Vc criou o objeto Criteria criteria, mas o resultado da consulta está sendo adicionado em Criterion retornoValor
e você está retornado criteria.uniqueResult(); e não o retornoValor.
Pode fazer assim:
public T getUniqueResult(String nomeDoCampo, Object valor) {
Session session = HibernateUtil.getSession();
return (T) session.createCriteria(classe).add(Restrictions.eq(nomeDoCampo, valor)).uniqueResult();
}
[quote=wagnerfrancisco]Um detalhe, você está usando Restrictions.gt e eu acho que teu objetivo (pelo que entendi da aplicação) era usar Restrictions.eq.
[/quote]
Tem razão, é isso mesmo, vou alterar amanhã, obrigado!!
Resolveram meu problema. Muito obrigado a todos que opinaram, segui a dica de todos, como por exemplo eliminar a necessidade de usar setMaxResults(1) de romarcio. Muito obrigado!