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
);
}