Problema no retorno do Criteria (Hibernate)

Caros amigos,

Meu sistema tem um método que retorna um objeto único, através do Hibernate, como é mostrado abaixo:

public T getUniqueResult(String nomeDoCampo, Object valor) {
   Session session = HibernateUtil.getSession();
   Criteria criteria = session.createCriteria(classe);
   Criterion retornoValor = Restrictions.gt(nomeDoCampo, valor);
   criteria.setMaxResults(1);
   return (T) criteria.uniqueResult();
}

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:

criteria.setMaxResults(1);
return (T) criteria.uniqueResult();

Pois o valor que está sendo retornado, que deveria ser “Fulano de Tal”, está sendo “Beltrano da Silva”, que é o primeiro da lista.

Alguma sugestão para resolver este problema? Grato pela atenção.

tenta assim:

NomeDaClasse obj = (NomeDaClasse) this.conexao.load(NomeDaClasse.class, id );

nao precisa de obj.list(); quando voce fizer o CRUD, ele faz a execução do SQL…
lembre-se de passar o id da consulta…

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=Der Meister]tenta assim:

NomeDaClasse obj = (NomeDaClasse) this.conexao.load(NomeDaClasse.class, id );

nao precisa de obj.list(); quando voce fizer o CRUD, ele faz a execução do SQL…
lembre-se de passar o id da consulta…[/quote]

Ah! Ok, vou tentar sim, obrigado!!

É verdade, é apenas um resultado único; obrigado!

Tentei sim, e o resultado permanece o mesmo.

Hum, entendo; ok, tentarei a sua solução proposta amanhã pela manhã, obrigado!!

Obrigado a todos que me responderam, tentarei utilizar as soluções oferecidas amanhã pela manhã na empresa e venho dar um feedback.

Atenciosamente

Magno

Um detalhe, você está usando Restrictions.gt e eu acho que teu objetivo (pelo que entendi da aplicação) era usar Restrictions.eq.

[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!!

As soluções:

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!