Java 8 Spring Data JPA 参数绑定
Posted
技术标签:
【中文标题】Java 8 Spring Data JPA 参数绑定【英文标题】:Java 8 Spring Data JPA Parameter binding 【发布时间】:2015-02-28 07:07:37 【问题描述】:在我的@Repository 接口中,我使用包含参数(addressType)的JPQL @Query 创建了自定义查找方法。
from Address a where a.addressType = :addressType
在方法中我没有在参数上指定@Param("addressType")。所以我得到了
java.lang.IllegalArgumentException:参数绑定的名称不能为空或空!对于命名参数,您需要在 Java 版本 上使用 @Param 查询方法参数
好的,这很清楚,但我使用的是 Java 8。那么 Java 8 有什么特别之处呢?
【问题讨论】:
天哪,您在 JPQL 查询中省略了“SELECT a”,所以它现在是非法的。 【参考方案1】:@JB Nizet 给出的答案是正确的,但我只是想指出在使用 Eclipse 时为 Java 8 编译器添加 -parameters
标志的方法。这是在窗口 -> 首选项中:
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 编译器
【讨论】:
这个是依赖还是下载了jar文件? 这是一个maven插件@Deva 那么,当我创建war文件时,这会增加我的项目大小吗?【参考方案2】:在 Java 8 中,您可以使用反射来访问方法的参数名称。这使得 @Param
注释变得不必要了,因为 Spring 可以从方法参数的名称中推断出 JPQL 参数的名称。
但您需要在编译器中使用-parameters
标志才能获得该信息。
见http://docs.oracle.com/javase/tutorial/reflect/member/methodparameterreflection.html。
【讨论】:
感谢您的回答。但我使用的是 Java8,SpringData 仍然要求我提供 @Param 注释。 您是否按照我链接到的页面中的说明使用 -parameters 选项编译了您的类? 不,我没有尝试过,我决定坚持使用@Param 注释,因为如果没有特殊的编译配置,代码将无法工作。但是,您的评论解释了您在主要答案中的意思。谢谢!【参考方案3】:JB Nizet 和 Xtreme Biker 的回答都是正确的。我只想补充一点,如果您使用 Spring Boot,spring-boot-starter-parent
(Gradle 或 Maven)已经为您添加了 -parameters
编译器标志:
plugin
delegate.groupId('org.apache.maven.plugins')
delegate.artifactId('maven-compiler-plugin')
configuration
delegate.parameters('true')
【讨论】:
以上是关于Java 8 Spring Data JPA 参数绑定的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 最佳实践Spring Data JPA 操作 MySQL 8
[SpringBoot] Spring BootSpring Data JPA 操作 MySQL 8
[SpringBoot] Spring BootSpring Data JPA 操作 MySQL 8
Spring Data JPA:InvalidDataAccessApiUsageException:参数值 [web] 与预期类型不匹配 [java.util.Collection (n/a)];