Java 8 Spring Data JPA参数绑定

And*_*kyi 15 jpa jpql java-8 spring-data-jpa

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

from Address a where a.addressType = :addressType

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

java.lang.IllegalArgumentException:参数绑定的名称不能为null或为空!对于命名参数,您需要在Java版本<8上使用@Param作为查询方法参数.

好的,这很清楚,但我使用的是Java 8.那么Java 8的特殊之处在哪里呢?

JB *_*zet 12

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

但是您需要使用-parameters编译器的标志来获取该信息.

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

  • 您是否使用-parameters选项编译了类,如我链接到的页面中所述? (3认同)
  • 谢谢你的回答。但是我使用的是 Java8 并且 SpringData 仍然要求我提供 @Param 注释。 (2认同)

Xtr*_*ica 10

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

在此输入图像描述

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>
Run Code Online (Sandbox Code Playgroud)