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')
}
}
在我的@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')
}
}