So I'm using Gradle, Eclipse, Java 11, Spring Boot with some Spring Data JPA repositories.
In Eclipse, I've tested with 3 different JDK libraries configured in the build path and in the execution: OpenJDK, OracleJDK and GraalVM.
I get the same error every time:
Caused by: java.lang.IllegalArgumentException: Either use @Param on all parameters except Pageable and Sort typed once, or none at all!
Because of a line like:
@Query("select e from Entity e where e.value = :value")
Optional<Entity> findByValue(String value);
Guaranteed to work would be to add @Param("value")
for the parameter, but I don't want to do that because this project has a lot of repositories.
If I run this under the command line ./gradlew bootRun
where I set one of the JDKs, this error does not occur.
If I try to reproduce this under a new project, but under Maven where I set the properties for java and maven for Java 11, then it works just fine under Eclipse.
The Gradle project works fine under a IntelliJ IDEA.
Can someone please help in explaining why this is happening? Does Eclipse bode well with Maven but not with Gradle? I can't fine an explanation.
CodePudding user response:
It's a compiler argument.
Seems that when the code is compiled, depending on the project, it will run with or without the -parameters
argument to the javac
command. When you run javac --help
, the following line explains:
...
-parameters
Generate metadata for reflection on method parameters
...
This parameter is vital if you don't want to use @Param("value")
in the repository method parameter, because this helps Spring Data determine the name of the parameter and assign it to :value
.
In Eclipse(as of 2022-06), for your specific project, go to project Properties > Java Compiler
and check "Store information about method parameters(usable via reflection)"
and the project will work without "@Param" annotations in the repository method parameters:
I still find it strange why on Maven projects this is activated but not on Gradle projects.
These answers helped me:
For IntelliJ IDEA, this might be a useful answer: