1
resposta

Erro ao rodar consulta jpql

Após criar a query JPQL com parâmetros nomeados, ao executar o filtro recebi:

*Descrição do erro :: *

org.springframework.dao.InvalidDataAccessApiUsageException: For queries with named parameters you need to provide names for method parameters; Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters
    at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:368) ~[spring-orm-6.2.7.jar:6.2.7]
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:246) ~[spring-orm-6.2.7.jar:6.2.7]

Isso ocorre porque o Spring Data não encontrou os nomes dos parâmetros (:totalTemporadas, :avaliacao) no bytecode, e por isso não sabia a que variável atrelá-los.

trecho:: interface SerieRepository

@Query("select s from Serie s WHERE s.totalTemporadas <= :totalTemporadas AND s.avaliacao >= :avaliacao")
    List<Serie> seriesPorTemporadaEAvaliacao(Integer totalTemporadas, Double avaliacao);

trecho:: class Principal

List<Serie> filtroSeries = repositorio.seriesPorTemporadaEAvaliacao(numeroMaximoTemporadas, avaliacaoMinima);

Soluções aplicáveis que até o momento que encontrei ::

Opção (1). Habilitar -parameters no Maven Compiler Plugin Assim o compilador Java preserva os nomes dos parâmetros no bytecode e o Spring Data passa a reconhecê-los automaticamente.

add esse trecho no arquivo pom.xml

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>  <!-- use a versão que preferir -->
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <!-- ativa o parâmetro -parameters -->
                    <compilerArgs>
                        <arg>-parameters</arg>
                    </compilerArgs>
                </configuration>
            </plugin>

e depois executei

mvn clean compile

Ou opção (2). Anotar parâmetros com @Param

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.data.jpa.repository.JpaRepository;

public interface SerieRepository extends JpaRepository<Serie, Long> {

    @Query("""
      select s
      from Serie s
      where s.totalTemporadas <= :totalTemporadas
        and s.avaliacao       >= :avaliacao
      """)
    List<Serie> seriesPorTemporadaEAvaliacao(
        @Param("totalTemporadas") Integer totalTemporadas,
        @Param("avaliacao")       Double  avaliacao
    );
}
1 resposta

Estranho em