Erro de hibernação "Nem todos os parâmetros nomeados foram definidos"

Erro de hibernação "Nem todos os parâmetros nomeados foram definidos"

1. Introdução

Ao trabalhar comHibernate, podemos usar parâmetros nomeados para passar dados com segurança para uma consulta SQL. Atribuímos valores para consultar parâmetros em tempo de execução para torná-los dinâmicos. Mais importante, isso ajuda a impedir ataques de injeção SQL.

No entanto, podemos encontrar erros ao trabalhar com parâmetros nomeados. Dois dos mais comuns da biblioteca autônoma do Hibernate e da implementação do Hibernate JPA, respectivamente, são:

  • Nem todos os parâmetros nomeados foram definidos

  • Parâmetro nomeado não vinculado

Embora as mensagens de erro possam diferir entre o Hibernate baunilha e sua implementação JPA, a causa raiz é a mesma.

Neste tutorial, daremos uma olhada emwhat causes these errors and how to avoid them. Ao longo do caminho, demonstraremos como usar parâmetros nomeados com a biblioteca autônoma do Hibernate.

2. O que causa o erro

Ao trabalhar com parâmetros nomeados no Hibernate,we must assign a value to each named parameter before executing the query.

Vejamos um exemplo de uma consulta que usa um parâmetro nomeado:

Query query = session.createQuery("from Event E WHERE E.title = :eventTitle", Event.class);

Neste exemplo, temos um parâmetro nomeado, indicado pelo marcador:eventTitle. O Hibernate espera que este parâmetro seja definido antes de executar a consulta.

No entanto, se tentarmos executar a consulta sem definir o valor para: _eventTitle_:

List listOfEvents = query.list();

O Hibernate lançaráorg.hibernate.QueryException quando o executarmos e obteremos o erro:

Not all named parameters have been set

3. Corrigindo o erro

Para corrigir o erro, simplesmente fornecemos um valor para o parâmetro nomeado antes de executar a consulta:

Query query = session.createQuery("from Event E WHERE E.title = :eventTitle", Event.class);
query.setParameter("eventTitle", "Event 1");

assertEquals(1, query.list().size());

Usando o métodosetParameter(String, String) do objetoquery, informamos ao Hibernate qual valor queremos usar para o parâmetro nomeado.

4. Conclusão

Neste artigo, vimos os parâmetros nomeados e como eles são usados ​​no Hibernate. Também mostramos como corrigir um dos erros de consulta nomeados nos quais podemos encontrar.

Como de costume, todos os exemplos de código estão disponíveisover on GitHub.