Questão nº 32
Questão de Tecnologia da Informação · FCC TRE-PR 2017 (nº 32)
Considere o fragmento de código abaixo, que utiliza Hibernate Session, em um ambiente Java ideal.
```
Query q = getSession().createQuery("from Candidato where nome_candidato = :nome_candidato");
q.setString("nome_candidato","João");
```
Nesta consulta, caso o candidato João seja único na tabela do banco de dados, para obter os dados deste candidato em um objeto da classe Candidato, utiliza-se, na sequência do código, a instrução: `Candidato candidato =`
- A`(Candidato) q.uniqueResult();` (alternativa correta)
- B`q.getUsuario();`
- C`q.getResultAll();`
- D`(Candidato) q.getSession().getResult();`
- E`q.uniqueResult();`
Resposta comentada
Gabarito Alternativa A
Quando você faz uma consulta no Hibernate e espera que ela retorne apenas um único item (como um candidato específico), você usa um método especial para pegar esse item, e muitas vezes precisa converter o resultado para o tipo certo de objeto.
-
(A) Correta:
(Candidato) q.uniqueResult();
A instruçãouniqueResult()é o método padrão do Hibernate para executar uma consulta e retornar um único objeto. Se a consulta encontrar mais de um resultado, ela lançará uma exceção; se não encontrar nenhum, retornaránull. O(Candidato)é um cast (conversão de tipo), necessário porqueuniqueResult()retorna umObject, e precisamos explicitamente dizer ao Java que esperamos um objeto do tipoCandidatopara atribuí-lo à variávelcandidato. -
(B) Incorreta:
q.getUsuario();
Não existe um métodogetUsuario()na interfaceQuerydo Hibernate. AQueryé usada para configurar e executar a consulta, não para acessar propriedades de um objeto resultante diretamente. -
(C) Incorreta:
q.getResultAll();
Não existe um métodogetResultAll()na interfaceQuerydo Hibernate. Para obter uma lista de resultados, o método serialist()ougetResultList()(no JPA), que retornaria uma coleção, não um único objeto. -
(D) Incorreta:
(Candidato) q.getSession().getResult();
Emboraq.getSession()retorne aSessioncorreta, não existe um métodogetResult()na interfaceSessionpara obter resultados de consulta dessa forma. ASessioné usada para gerenciar o contexto de persistência, e as consultas são executadas pelo objetoQuery. -
(E) Incorreta:
q.uniqueResult();
Esta alternativa usa o método correto (uniqueResult()) para obter um único resultado. No entanto, o métodouniqueResult()retorna umObject. Para atribuir esseObjecta uma variável do tipoCandidato(como emCandidato candidato = ...), é obrigatório fazer um cast explícito para(Candidato). Sem o cast, o código não compilaria, pois o Java não sabe automaticamente que oObjectretornado é umCandidato. Armadilha: Esta é a alternativa mais tentadora porque o métodouniqueResult()está correto, mas a "pegadinha" é a omissão do cast necessário para que o código seja válido em Java.
Fonte: FCC TRE-PR 2017 Técnico Judiciário - Área Apoio Especializado - Especialidade Programação de Sistemas (Caderno Tipo 1). Reproduzida para fins de estudo.