Java 8 Spring 数据JPA参数绑定

Java 8 Spring Data JPA Parameter binding

在我的@Repository 接口中,我使用包含参数 (addressType) 的 JPQL @Query 创建了自定义查找方法。

from Address a where a.addressType = :addressType

在方法中我没有在参数上指定@Param("addressType")。所以我得到

java.lang.IllegalArgumentException: Name for parameter binding must not be null or empty! For named parameters you need to use @Param for query method parameters on Java versions < 8.

好吧,这已经很清楚了,但是我使用的是Java 8。那么这里的Java 8有什么特别之处呢?

在Java8中,您可以使用反射来访问方法的参数名称。这使得 @Param 注释变得不必要,因为 Spring 可以从方法参数的名称中推断出 JPQL 参数的名称。

但是您需要在编译器中使用 -parameters 标志才能获得该信息。

参见http://docs.oracle.com/javase/tutorial/reflect/member/methodparameterreflection.html

@JB Nizet 给出的答案是正确的,但我只是想指出在使用 Eclipse 时为 Java 8 编译器添加 -parameters 标志的方法。这是在 Window -> 首选项:

Maven 还允许在 pom 本身中添加标志:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.5.1</version>
    <configuration>
        <compilerArgs>
            <arg>-verbose</arg>
            <arg>-parameters</arg>
        </compilerArgs>
    </configuration>
</plugin>

在使用 IDEA IntelliJ 时为 Java 8 编译器添加参数标志

文件 > 设置 > 构建、执行、部署 > 编译器 > Java 编译器

JB Nizet 和 Xtreme Biker 的回答都是正确的。我只想补充一点,如果您使用 Spring 启动,-parameters 编译器标志已经由 spring-boot-starter-parent(Gradle 或 Maven)为您添加:

plugin {
    delegate.groupId('org.apache.maven.plugins')
    delegate.artifactId('maven-compiler-plugin')
    configuration {
        delegate.parameters('true')
    }
}