A anotação @Query, como o próprio nome já sugere, diz respeito a criação de uma query SQL personalizada para nossos projetos. Com ela é possível definir ações customizadas para operações do banco de dados, como consultas, atualizações e remoções personalizadas.

Propriedade value

A propriedade value tem como objetivo definir a query personalizada que desejamos declarar e associar a função a qual a anotação está associada. Vejamos um exemplo.

👨‍💻 Exemplo prático

@Query(value="select * from pessoas where id=?1",nativeQuery=true)
public List<Pessoa> buscarDadosPessoais(int id)

📌 Observação importante

É importante ressaltar que podemos utilizar a injeção de parâmetros em nossa query. Para tal devemos utilizar a seguinte coringa: ?n, sendo que n é o número do parâmetro que desejamos associar a nossa query, sendo que o número deve começar em 1 (um). Sendo que o coringa será substituído pelo valor passado no parâmetro informado.

Anotação @Modifying

A anotação @Modifying é utilizada para operações de DML, ou seja, quando necessitamos inserir, remover ou atualizar registro de nossa base de dados.

Ela tem como função definir que a query em questão poderá manipular dados de nossa base de dados, ou seja, poderá realizar a atualização, inserção ou remoção de registros do banco de dados. Caso não informemos essa anotação, ao tentarmos executar o método em questão a mesma resultará em uma GenericJDBCException como é mostrado abaixo.

👨‍💻 Exemplo prático

org.springframework.orm.jpa.JpaSystemException: could not extract ResultSet; nested exception is org.hibernate.exception.GenericJDBCException: could not extract ResultSet

Anotação @Transactional

A anotação @Transactional é utilizada quando necessitamos remover ou atualizar registro de nossa base de dados.

Essa anotação nos permite definir que utilizaremos transações em nossas operação DML. Caso não informemos essa anotação, ao tentarmos executar o método em questão, a mesma resultará em uma InvalidDataAccessApiUsageException como é mostrado abaixo.

👨‍💻 Exemplo prático

org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query

Query de atualização

No exemplo abaixo temos um trecho de código que nos mostra como podemos realizar atualizações personalizadas em uma aplicação Spring usando a Spring JPA .

👨‍💻 Exemplo prático