1
resposta

Failed to execute CommandLineRunner

@Query("SELECT f FROM Funcionario f WHERE f.nome= :nome AND f.salario >= :salario AND f.dataContratacao = :data") public List findByNomeSalarioMaiorDataContratacao(String nome, BigDecimal salario,LocalDate data);

Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: For queries with named parameters you need to use provide names for method parameters. Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters.; nested exception is java.lang.IllegalStateException: For queries with named parameters you need to use 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:371) ~[spring-orm-5.3.8.jar:5.3.8]
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:235) ~[spring-orm-5.3.8.jar:5.3.8]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:551) ~[spring-orm-5.3.8.jar:5.3.8]
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) ~[spring-tx-5.3.8.jar:5.3.8]
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242) ~[spring-tx-5.3.8.jar:5.3.8]
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152) ~[spring-tx-5.3.8.jar:5.3.8]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.8.jar:5.3.8]
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:145) ~[spring-data-jpa-2.5.1.jar:2.5.1]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.8.jar:5.3.8]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.8.jar:5.3.8]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.8.jar:5.3.8]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.8.jar:5.3.8]
at com.sun.proxy.$Proxy79.findByNomeSalarioMaiorDataContratacao(Unknown Source) ~[na:na]
at br.com.alura.spring.data.service.RelatorioService.BuscaNomeSalarioMaiorData(RelatorioService.java:64) ~[classes/:na]
at br.com.alura.spring.data.service.RelatorioService.iniciar(RelatorioService.java:38) ~[classes/:na]
at br.com.alura.spring.data.SpringDataApplication.run(SpringDataApplication.java:61) [classes/:na]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:791) [spring-boot-2.5.1.jar:2.5.1]
... 5 common frames omitted
1 resposta

Olá Fernanda!

Você vai precisar identificar o nome de cada parâmetro com a anotação @Param, pois apenas utilizando o mesmo nome dos parâmetros da função não garante que o Spring consiga identificar qual é cada parâmetro.

Exemplo:

@Query("SELECT f FROM Funcionario f WHERE f.nome= :nome AND f.salario >= :salario AND f.dataContratacao = :data")
public List findByNomeSalarioMaiorDataContratacao(@Param("nome") String nome, @Param("salario") BigDecimal salario, @Param("data") LocalDate data);

Para o Spring reconhecer os nomes dos parâmetros do método direto sem o @Param depende de algumas configurações do java na hora da compilação do código, então é melhor você sempre utilizar o @Param

Fonte: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.named-parameters

Espero ter ajudado, qualquer coisa é só falar!